Skip to content

Commit a1a2d7c

Browse files
authored
Merge pull request github#12355 from geoffw0/splittest
Swift: Split the taint flow test.
2 parents fd9b279 + 8e069b7 commit a1a2d7c

23 files changed

+253
-6886
lines changed

swift/ql/test/library-tests/dataflow/taint/LocalTaint.expected

Lines changed: 0 additions & 3583 deletions
This file was deleted.

swift/ql/test/library-tests/dataflow/taint/Taint.expected

Lines changed: 0 additions & 3303 deletions
This file was deleted.
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
| simple.swift:12:13:12:13 | 1 | simple.swift:12:13:12:24 | ... .+(_:_:) ... |
2+
| simple.swift:12:17:12:24 | call to source() | simple.swift:12:13:12:24 | ... .+(_:_:) ... |
3+
| simple.swift:13:13:13:20 | call to source() | simple.swift:13:13:13:24 | ... .+(_:_:) ... |
4+
| simple.swift:13:24:13:24 | 1 | simple.swift:13:13:13:24 | ... .+(_:_:) ... |
5+
| simple.swift:14:13:14:13 | 1 | simple.swift:14:13:14:24 | ... .-(_:_:) ... |
6+
| simple.swift:14:17:14:24 | call to source() | simple.swift:14:13:14:24 | ... .-(_:_:) ... |
7+
| simple.swift:15:13:15:20 | call to source() | simple.swift:15:13:15:24 | ... .-(_:_:) ... |
8+
| simple.swift:15:24:15:24 | 1 | simple.swift:15:13:15:24 | ... .-(_:_:) ... |
9+
| simple.swift:16:13:16:13 | 2 | simple.swift:16:13:16:24 | ... .*(_:_:) ... |
10+
| simple.swift:16:17:16:24 | call to source() | simple.swift:16:13:16:24 | ... .*(_:_:) ... |
11+
| simple.swift:17:13:17:20 | call to source() | simple.swift:17:13:17:24 | ... .*(_:_:) ... |
12+
| simple.swift:17:24:17:24 | 2 | simple.swift:17:13:17:24 | ... .*(_:_:) ... |
13+
| simple.swift:18:13:18:13 | 100 | simple.swift:18:13:18:26 | ... ./(_:_:) ... |
14+
| simple.swift:18:19:18:26 | call to source() | simple.swift:18:13:18:26 | ... ./(_:_:) ... |
15+
| simple.swift:19:13:19:20 | call to source() | simple.swift:19:13:19:24 | ... ./(_:_:) ... |
16+
| simple.swift:19:24:19:24 | 100 | simple.swift:19:13:19:24 | ... ./(_:_:) ... |
17+
| simple.swift:20:13:20:13 | 100 | simple.swift:20:13:20:26 | ... .%(_:_:) ... |
18+
| simple.swift:20:19:20:26 | call to source() | simple.swift:20:13:20:26 | ... .%(_:_:) ... |
19+
| simple.swift:21:13:21:20 | call to source() | simple.swift:21:13:21:24 | ... .%(_:_:) ... |
20+
| simple.swift:21:24:21:24 | 100 | simple.swift:21:13:21:24 | ... .%(_:_:) ... |
21+
| simple.swift:23:14:23:21 | call to source() | simple.swift:23:13:23:21 | call to -(_:) |
22+
| simple.swift:36:7:36:7 | SSA def(a) | simple.swift:37:13:37:13 | a |
23+
| simple.swift:36:11:36:11 | 0 | simple.swift:36:7:36:7 | SSA def(a) |
24+
| simple.swift:37:13:37:13 | [post] a | simple.swift:38:3:38:3 | a |
25+
| simple.swift:37:13:37:13 | a | simple.swift:38:3:38:3 | a |
26+
| simple.swift:38:3:38:3 | &... | simple.swift:39:13:39:13 | a |
27+
| simple.swift:38:3:38:3 | [post] &... | simple.swift:39:13:39:13 | a |
28+
| simple.swift:38:3:38:3 | a | simple.swift:38:3:38:3 | &... |
29+
| simple.swift:38:8:38:8 | 1 | simple.swift:38:3:38:3 | &... |
30+
| simple.swift:39:13:39:13 | [post] a | simple.swift:40:3:40:3 | a |
31+
| simple.swift:39:13:39:13 | a | simple.swift:40:3:40:3 | a |
32+
| simple.swift:40:3:40:3 | &... | simple.swift:41:13:41:13 | a |
33+
| simple.swift:40:3:40:3 | [post] &... | simple.swift:41:13:41:13 | a |
34+
| simple.swift:40:3:40:3 | a | simple.swift:40:3:40:3 | &... |
35+
| simple.swift:40:8:40:15 | call to source() | simple.swift:40:3:40:3 | &... |
36+
| simple.swift:41:13:41:13 | [post] a | simple.swift:42:3:42:3 | a |
37+
| simple.swift:41:13:41:13 | a | simple.swift:42:3:42:3 | a |
38+
| simple.swift:42:3:42:3 | &... | simple.swift:43:13:43:13 | a |
39+
| simple.swift:42:3:42:3 | [post] &... | simple.swift:43:13:43:13 | a |
40+
| simple.swift:42:3:42:3 | a | simple.swift:42:3:42:3 | &... |
41+
| simple.swift:42:8:42:8 | 1 | simple.swift:42:3:42:3 | &... |
42+
| simple.swift:44:3:44:7 | SSA def(a) | simple.swift:45:13:45:13 | a |
43+
| simple.swift:44:7:44:7 | 0 | simple.swift:44:3:44:7 | SSA def(a) |
44+
| simple.swift:47:7:47:7 | SSA def(b) | simple.swift:48:3:48:3 | b |
45+
| simple.swift:47:11:47:11 | 128 | simple.swift:47:7:47:7 | SSA def(b) |
46+
| simple.swift:48:3:48:3 | &... | simple.swift:49:13:49:13 | b |
47+
| simple.swift:48:3:48:3 | [post] &... | simple.swift:49:13:49:13 | b |
48+
| simple.swift:48:3:48:3 | b | simple.swift:48:3:48:3 | &... |
49+
| simple.swift:48:8:48:15 | call to source() | simple.swift:48:3:48:3 | &... |
50+
| simple.swift:49:13:49:13 | [post] b | simple.swift:50:3:50:3 | b |
51+
| simple.swift:49:13:49:13 | b | simple.swift:50:3:50:3 | b |
52+
| simple.swift:50:3:50:3 | &... | simple.swift:51:13:51:13 | b |
53+
| simple.swift:50:3:50:3 | [post] &... | simple.swift:51:13:51:13 | b |
54+
| simple.swift:50:3:50:3 | b | simple.swift:50:3:50:3 | &... |
55+
| simple.swift:50:8:50:8 | 1 | simple.swift:50:3:50:3 | &... |
56+
| simple.swift:53:7:53:7 | SSA def(c) | simple.swift:54:3:54:3 | c |
57+
| simple.swift:53:11:53:11 | 10 | simple.swift:53:7:53:7 | SSA def(c) |
58+
| simple.swift:54:3:54:3 | &... | simple.swift:55:13:55:13 | c |
59+
| simple.swift:54:3:54:3 | [post] &... | simple.swift:55:13:55:13 | c |
60+
| simple.swift:54:3:54:3 | c | simple.swift:54:3:54:3 | &... |
61+
| simple.swift:54:8:54:15 | call to source() | simple.swift:54:3:54:3 | &... |
62+
| simple.swift:55:13:55:13 | [post] c | simple.swift:56:3:56:3 | c |
63+
| simple.swift:55:13:55:13 | c | simple.swift:56:3:56:3 | c |
64+
| simple.swift:56:3:56:3 | &... | simple.swift:57:13:57:13 | c |
65+
| simple.swift:56:3:56:3 | [post] &... | simple.swift:57:13:57:13 | c |
66+
| simple.swift:56:3:56:3 | c | simple.swift:56:3:56:3 | &... |
67+
| simple.swift:56:8:56:8 | 2 | simple.swift:56:3:56:3 | &... |
68+
| simple.swift:59:7:59:7 | SSA def(d) | simple.swift:60:3:60:3 | d |
69+
| simple.swift:59:11:59:11 | 100 | simple.swift:59:7:59:7 | SSA def(d) |
70+
| simple.swift:60:3:60:3 | &... | simple.swift:61:13:61:13 | d |
71+
| simple.swift:60:3:60:3 | [post] &... | simple.swift:61:13:61:13 | d |
72+
| simple.swift:60:3:60:3 | d | simple.swift:60:3:60:3 | &... |
73+
| simple.swift:60:8:60:15 | call to source() | simple.swift:60:3:60:3 | &... |
74+
| simple.swift:61:13:61:13 | [post] d | simple.swift:62:3:62:3 | d |
75+
| simple.swift:61:13:61:13 | d | simple.swift:62:3:62:3 | d |
76+
| simple.swift:62:3:62:3 | &... | simple.swift:63:13:63:13 | d |
77+
| simple.swift:62:3:62:3 | [post] &... | simple.swift:63:13:63:13 | d |
78+
| simple.swift:62:3:62:3 | d | simple.swift:62:3:62:3 | &... |
79+
| simple.swift:62:8:62:8 | 2 | simple.swift:62:3:62:3 | &... |
80+
| simple.swift:65:7:65:7 | SSA def(e) | simple.swift:66:3:66:3 | e |
81+
| simple.swift:65:11:65:11 | 1000 | simple.swift:65:7:65:7 | SSA def(e) |
82+
| simple.swift:66:3:66:3 | &... | simple.swift:67:13:67:13 | e |
83+
| simple.swift:66:3:66:3 | [post] &... | simple.swift:67:13:67:13 | e |
84+
| simple.swift:66:3:66:3 | e | simple.swift:66:3:66:3 | &... |
85+
| simple.swift:66:8:66:15 | call to source() | simple.swift:66:3:66:3 | &... |
86+
| simple.swift:67:13:67:13 | [post] e | simple.swift:68:3:68:3 | e |
87+
| simple.swift:67:13:67:13 | e | simple.swift:68:3:68:3 | e |
88+
| simple.swift:68:3:68:3 | &... | simple.swift:69:13:69:13 | e |
89+
| simple.swift:68:3:68:3 | [post] &... | simple.swift:69:13:69:13 | e |
90+
| simple.swift:68:3:68:3 | e | simple.swift:68:3:68:3 | &... |
91+
| simple.swift:68:8:68:8 | 100 | simple.swift:68:3:68:3 | &... |
92+
| subscript.swift:1:7:1:7 | SSA def(self) | subscript.swift:1:7:1:7 | self[return] |
93+
| subscript.swift:1:7:1:7 | SSA def(self) | subscript.swift:1:7:1:7 | self[return] |
94+
| subscript.swift:1:7:1:7 | self | subscript.swift:1:7:1:7 | SSA def(self) |
95+
| subscript.swift:1:7:1:7 | self | subscript.swift:1:7:1:7 | SSA def(self) |
96+
| subscript.swift:2:5:2:5 | self | subscript.swift:2:5:2:5 | SSA def(self) |
97+
| subscript.swift:3:9:3:9 | SSA def(self) | subscript.swift:3:9:3:25 | self[return] |
98+
| subscript.swift:3:9:3:9 | self | subscript.swift:3:9:3:9 | SSA def(self) |
99+
| subscript.swift:4:9:4:9 | SSA def(self) | subscript.swift:4:9:4:24 | self[return] |
100+
| subscript.swift:4:9:4:9 | self | subscript.swift:4:9:4:9 | SSA def(self) |
101+
| subscript.swift:13:15:13:22 | call to source() | subscript.swift:13:15:13:25 | ...[...] |
102+
| subscript.swift:14:15:14:23 | call to source2() | subscript.swift:14:15:14:26 | ...[...] |
103+
| try.swift:8:17:8:23 | call to clean() | try.swift:8:13:8:23 | try ... |
104+
| try.swift:9:17:9:24 | call to source() | try.swift:9:13:9:24 | try ... |
105+
| try.swift:14:17:14:23 | call to clean() | try.swift:14:12:14:23 | try! ... |
106+
| try.swift:15:17:15:24 | call to source() | try.swift:15:12:15:24 | try! ... |
107+
| try.swift:17:13:17:24 | try? ... | try.swift:17:12:17:26 | ...! |
108+
| try.swift:17:18:17:24 | call to clean() | try.swift:17:13:17:24 | try? ... |
109+
| try.swift:18:13:18:25 | try? ... | try.swift:18:12:18:27 | ...! |
110+
| try.swift:18:18:18:25 | call to source() | try.swift:18:13:18:25 | try? ... |
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
edges
2+
| simple.swift:12:17:12:24 | call to source() : | simple.swift:12:13:12:24 | ... .+(_:_:) ... |
3+
| simple.swift:13:13:13:20 | call to source() : | simple.swift:13:13:13:24 | ... .+(_:_:) ... |
4+
| simple.swift:14:17:14:24 | call to source() : | simple.swift:14:13:14:24 | ... .-(_:_:) ... |
5+
| simple.swift:15:13:15:20 | call to source() : | simple.swift:15:13:15:24 | ... .-(_:_:) ... |
6+
| simple.swift:16:17:16:24 | call to source() : | simple.swift:16:13:16:24 | ... .*(_:_:) ... |
7+
| simple.swift:17:13:17:20 | call to source() : | simple.swift:17:13:17:24 | ... .*(_:_:) ... |
8+
| simple.swift:18:19:18:26 | call to source() : | simple.swift:18:13:18:26 | ... ./(_:_:) ... |
9+
| simple.swift:19:13:19:20 | call to source() : | simple.swift:19:13:19:24 | ... ./(_:_:) ... |
10+
| simple.swift:20:19:20:26 | call to source() : | simple.swift:20:13:20:26 | ... .%(_:_:) ... |
11+
| simple.swift:21:13:21:20 | call to source() : | simple.swift:21:13:21:24 | ... .%(_:_:) ... |
12+
| simple.swift:23:14:23:21 | call to source() : | simple.swift:23:13:23:21 | call to -(_:) |
13+
| simple.swift:40:8:40:15 | call to source() : | simple.swift:41:13:41:13 | a |
14+
| simple.swift:40:8:40:15 | call to source() : | simple.swift:43:13:43:13 | a |
15+
| simple.swift:48:8:48:15 | call to source() : | simple.swift:49:13:49:13 | b |
16+
| simple.swift:48:8:48:15 | call to source() : | simple.swift:51:13:51:13 | b |
17+
| simple.swift:54:8:54:15 | call to source() : | simple.swift:55:13:55:13 | c |
18+
| simple.swift:54:8:54:15 | call to source() : | simple.swift:57:13:57:13 | c |
19+
| simple.swift:60:8:60:15 | call to source() : | simple.swift:61:13:61:13 | d |
20+
| simple.swift:60:8:60:15 | call to source() : | simple.swift:63:13:63:13 | d |
21+
| simple.swift:66:8:66:15 | call to source() : | simple.swift:67:13:67:13 | e |
22+
| simple.swift:66:8:66:15 | call to source() : | simple.swift:69:13:69:13 | e |
23+
| subscript.swift:13:15:13:22 | call to source() : | subscript.swift:13:15:13:25 | ...[...] |
24+
| subscript.swift:14:15:14:23 | call to source2() : | subscript.swift:14:15:14:26 | ...[...] |
25+
| try.swift:9:17:9:24 | call to source() : | try.swift:9:13:9:24 | try ... |
26+
| try.swift:15:17:15:24 | call to source() : | try.swift:15:12:15:24 | try! ... |
27+
| try.swift:18:18:18:25 | call to source() : | try.swift:18:12:18:27 | ...! |
28+
nodes
29+
| simple.swift:12:13:12:24 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... |
30+
| simple.swift:12:17:12:24 | call to source() : | semmle.label | call to source() : |
31+
| simple.swift:13:13:13:20 | call to source() : | semmle.label | call to source() : |
32+
| simple.swift:13:13:13:24 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... |
33+
| simple.swift:14:13:14:24 | ... .-(_:_:) ... | semmle.label | ... .-(_:_:) ... |
34+
| simple.swift:14:17:14:24 | call to source() : | semmle.label | call to source() : |
35+
| simple.swift:15:13:15:20 | call to source() : | semmle.label | call to source() : |
36+
| simple.swift:15:13:15:24 | ... .-(_:_:) ... | semmle.label | ... .-(_:_:) ... |
37+
| simple.swift:16:13:16:24 | ... .*(_:_:) ... | semmle.label | ... .*(_:_:) ... |
38+
| simple.swift:16:17:16:24 | call to source() : | semmle.label | call to source() : |
39+
| simple.swift:17:13:17:20 | call to source() : | semmle.label | call to source() : |
40+
| simple.swift:17:13:17:24 | ... .*(_:_:) ... | semmle.label | ... .*(_:_:) ... |
41+
| simple.swift:18:13:18:26 | ... ./(_:_:) ... | semmle.label | ... ./(_:_:) ... |
42+
| simple.swift:18:19:18:26 | call to source() : | semmle.label | call to source() : |
43+
| simple.swift:19:13:19:20 | call to source() : | semmle.label | call to source() : |
44+
| simple.swift:19:13:19:24 | ... ./(_:_:) ... | semmle.label | ... ./(_:_:) ... |
45+
| simple.swift:20:13:20:26 | ... .%(_:_:) ... | semmle.label | ... .%(_:_:) ... |
46+
| simple.swift:20:19:20:26 | call to source() : | semmle.label | call to source() : |
47+
| simple.swift:21:13:21:20 | call to source() : | semmle.label | call to source() : |
48+
| simple.swift:21:13:21:24 | ... .%(_:_:) ... | semmle.label | ... .%(_:_:) ... |
49+
| simple.swift:23:13:23:21 | call to -(_:) | semmle.label | call to -(_:) |
50+
| simple.swift:23:14:23:21 | call to source() : | semmle.label | call to source() : |
51+
| simple.swift:40:8:40:15 | call to source() : | semmle.label | call to source() : |
52+
| simple.swift:41:13:41:13 | a | semmle.label | a |
53+
| simple.swift:43:13:43:13 | a | semmle.label | a |
54+
| simple.swift:48:8:48:15 | call to source() : | semmle.label | call to source() : |
55+
| simple.swift:49:13:49:13 | b | semmle.label | b |
56+
| simple.swift:51:13:51:13 | b | semmle.label | b |
57+
| simple.swift:54:8:54:15 | call to source() : | semmle.label | call to source() : |
58+
| simple.swift:55:13:55:13 | c | semmle.label | c |
59+
| simple.swift:57:13:57:13 | c | semmle.label | c |
60+
| simple.swift:60:8:60:15 | call to source() : | semmle.label | call to source() : |
61+
| simple.swift:61:13:61:13 | d | semmle.label | d |
62+
| simple.swift:63:13:63:13 | d | semmle.label | d |
63+
| simple.swift:66:8:66:15 | call to source() : | semmle.label | call to source() : |
64+
| simple.swift:67:13:67:13 | e | semmle.label | e |
65+
| simple.swift:69:13:69:13 | e | semmle.label | e |
66+
| subscript.swift:13:15:13:22 | call to source() : | semmle.label | call to source() : |
67+
| subscript.swift:13:15:13:25 | ...[...] | semmle.label | ...[...] |
68+
| subscript.swift:14:15:14:23 | call to source2() : | semmle.label | call to source2() : |
69+
| subscript.swift:14:15:14:26 | ...[...] | semmle.label | ...[...] |
70+
| try.swift:9:13:9:24 | try ... | semmle.label | try ... |
71+
| try.swift:9:17:9:24 | call to source() : | semmle.label | call to source() : |
72+
| try.swift:15:12:15:24 | try! ... | semmle.label | try! ... |
73+
| try.swift:15:17:15:24 | call to source() : | semmle.label | call to source() : |
74+
| try.swift:18:12:18:27 | ...! | semmle.label | ...! |
75+
| try.swift:18:18:18:25 | call to source() : | semmle.label | call to source() : |
76+
subpaths
77+
#select
78+
| simple.swift:12:13:12:24 | ... .+(_:_:) ... | simple.swift:12:17:12:24 | call to source() : | simple.swift:12:13:12:24 | ... .+(_:_:) ... | result |
79+
| simple.swift:13:13:13:24 | ... .+(_:_:) ... | simple.swift:13:13:13:20 | call to source() : | simple.swift:13:13:13:24 | ... .+(_:_:) ... | result |
80+
| simple.swift:14:13:14:24 | ... .-(_:_:) ... | simple.swift:14:17:14:24 | call to source() : | simple.swift:14:13:14:24 | ... .-(_:_:) ... | result |
81+
| simple.swift:15:13:15:24 | ... .-(_:_:) ... | simple.swift:15:13:15:20 | call to source() : | simple.swift:15:13:15:24 | ... .-(_:_:) ... | result |
82+
| simple.swift:16:13:16:24 | ... .*(_:_:) ... | simple.swift:16:17:16:24 | call to source() : | simple.swift:16:13:16:24 | ... .*(_:_:) ... | result |
83+
| simple.swift:17:13:17:24 | ... .*(_:_:) ... | simple.swift:17:13:17:20 | call to source() : | simple.swift:17:13:17:24 | ... .*(_:_:) ... | result |
84+
| simple.swift:18:13:18:26 | ... ./(_:_:) ... | simple.swift:18:19:18:26 | call to source() : | simple.swift:18:13:18:26 | ... ./(_:_:) ... | result |
85+
| simple.swift:19:13:19:24 | ... ./(_:_:) ... | simple.swift:19:13:19:20 | call to source() : | simple.swift:19:13:19:24 | ... ./(_:_:) ... | result |
86+
| simple.swift:20:13:20:26 | ... .%(_:_:) ... | simple.swift:20:19:20:26 | call to source() : | simple.swift:20:13:20:26 | ... .%(_:_:) ... | result |
87+
| simple.swift:21:13:21:24 | ... .%(_:_:) ... | simple.swift:21:13:21:20 | call to source() : | simple.swift:21:13:21:24 | ... .%(_:_:) ... | result |
88+
| simple.swift:23:13:23:21 | call to -(_:) | simple.swift:23:14:23:21 | call to source() : | simple.swift:23:13:23:21 | call to -(_:) | result |
89+
| simple.swift:41:13:41:13 | a | simple.swift:40:8:40:15 | call to source() : | simple.swift:41:13:41:13 | a | result |
90+
| simple.swift:43:13:43:13 | a | simple.swift:40:8:40:15 | call to source() : | simple.swift:43:13:43:13 | a | result |
91+
| simple.swift:49:13:49:13 | b | simple.swift:48:8:48:15 | call to source() : | simple.swift:49:13:49:13 | b | result |
92+
| simple.swift:51:13:51:13 | b | simple.swift:48:8:48:15 | call to source() : | simple.swift:51:13:51:13 | b | result |
93+
| simple.swift:55:13:55:13 | c | simple.swift:54:8:54:15 | call to source() : | simple.swift:55:13:55:13 | c | result |
94+
| simple.swift:57:13:57:13 | c | simple.swift:54:8:54:15 | call to source() : | simple.swift:57:13:57:13 | c | result |
95+
| simple.swift:61:13:61:13 | d | simple.swift:60:8:60:15 | call to source() : | simple.swift:61:13:61:13 | d | result |
96+
| simple.swift:63:13:63:13 | d | simple.swift:60:8:60:15 | call to source() : | simple.swift:63:13:63:13 | d | result |
97+
| simple.swift:67:13:67:13 | e | simple.swift:66:8:66:15 | call to source() : | simple.swift:67:13:67:13 | e | result |
98+
| simple.swift:69:13:69:13 | e | simple.swift:66:8:66:15 | call to source() : | simple.swift:69:13:69:13 | e | result |
99+
| subscript.swift:13:15:13:25 | ...[...] | subscript.swift:13:15:13:22 | call to source() : | subscript.swift:13:15:13:25 | ...[...] | result |
100+
| subscript.swift:14:15:14:26 | ...[...] | subscript.swift:14:15:14:23 | call to source2() : | subscript.swift:14:15:14:26 | ...[...] | result |
101+
| try.swift:9:13:9:24 | try ... | try.swift:9:17:9:24 | call to source() : | try.swift:9:13:9:24 | try ... | result |
102+
| try.swift:15:12:15:24 | try! ... | try.swift:15:17:15:24 | call to source() : | try.swift:15:12:15:24 | try! ... | result |
103+
| try.swift:18:12:18:27 | ...! | try.swift:18:18:18:25 | call to source() : | try.swift:18:12:18:27 | ...! | result |

0 commit comments

Comments
 (0)