SlideShare a Scribd company logo
1 of 21
Download to read offline
ASE Sept 5, 2018
A Large-Scale Study of
Test Coverage Evolution
Michael Hilton, Jonathan Bell, and Darko Marinov
Carnegie Mellon University, George Mason University, and University of Illinois at Urbana-Champaign
http://www.code-coverage.org/
ASE Sept 5, 2018
Coverage is the start to a
conversation about test quality
total # of statements executed by tests
total # of statementsStatement Coverage =
code-coverage.orgASE Sept 5, 2018
Coverage Uses
• So how do the projects in the middle use coverage on a day-to-day
basis, in a regression environment?
• Try to increase coverage
• Try to ensure each change is covered
• Use coverage for regression test selection/flaky test detection
• Our goal: Revisit what coverage can be used for, develop new
metrics through an empirical study
code-coverage.orgASE Sept 5, 2018
1a. Literature
search
2a. Clone and build projects, collect
coverage
29 projects
5,360 builds
Identifying Projects Collecting Coverage
2b. Extract data from Coveralls API
1b. GitHub +
Coveralls mining
18 projects
2,456 builds
3. Analyze diffs and
coverage per-build
4. Visualize aggregate
data
47 projects,
7,816 builds
Synthesizing Results Generating Visualizations
Methodology
Our dataset of code coverage information from 7,816 revisions of 47
projects is publicly available: http://www.code-coverage.org/
+
2b. Extract data from Coveralls API
1b. GitHub +
Coveralls mining
1a. Literature
search
2a. Clone and build projects, collect
coverage
3. Analyze diffs and
coverage per-build
4. Visualize aggregate
data
18 projects
29 projects
2,456 builds
5,360 builds
47 projects,
7,816 builds
Identifying Projects Collecting Coverage Synthesizing Results Generating Visualizations
Coveralls: A (previously) untapped new resource for
researchers
code-coverage.orgASE Sept 5, 2018
Tooling
We used diff to compare across file versions to track the changes to
unchanged but moved lines
$ diff --unchanged-line-format="%dn,%c'12'" --new-line-format="n%c'12'" --old-
line-format="" $FILE1 $FILE2 | awk '/,/{n++;print $0n} /n/{n++}'"
1. Foo;
2. Bar;
1. New;
2. Foo;
3. Bar;
Source file,
version 1
Source file,
version 2
code-coverage.orgASE Sept 5, 2018
New Questions
• Which statements were covered but are no longer covered?
• Which statements are newly covered?
• Which statements flap between covered and uncovered?
• Broadly: How does a change to one statement impact the
coverage of other statements?
code-coverage.orgASE Sept 5, 2018
RQ: Instead of trying to examine the total
coverage, is it enough to monitor just the
patch coverage?
code-coverage.orgASE Sept 5, 2018
Patch coverage does not correlate with
overall coverage
P1
P2
P3
P4
P5
P6
P7
P8
P9
P10
P11
P12
P13
P14
P15
P16
P17
P18
P19
P20
P21
P22
P23
P24
P25
P26
P27
P28
P29
P30
P31
P32
P33
P34
P35
P36
P37
P38
P39
P40
P41
P42
P43
P44
P45
P46
P47
0 (0−25) (25−50] (50−75] (75−100) 100
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
0% 25% 50% 75% 100%
Percent of builds satisfying patch coverage % at level indicated by color:
Percent of builds satisfying coverage % at level indicated by color:
0 (0−25) (25−50] (50−75] (75−100) 100
25% 50% 75%
Percent of builds satisfying patch coverage % at level indicated by color:
Implication for developers: Do not rely on patch
coverage as an indicator of overall quality
code-coverage.orgASE Sept 5, 2018
int x = 12;
if(x > 10)
{
doStuff();
}
RQ: What impact do patches have on the
coverage of non-patch code?
int x = 12;
if(x > 10)
{
doStuff();
}
Original version: all lines covered,
doStuff() is called
if(x > 10)
{
doStuff();
}
int x = 10;
New version: first line changed,
reduces coverage since doStuff() not
called
code-coverage.orgASE Sept 5, 2018
Patches often impact coverage of existing (non-patch) code
P01
P02
P03
P04
P05
P06
P07
P08
P09
P10
P11
P12
P13
P14
P15
P16
P17
P18
P19
P20
P21
P22
P23
P24
P25
P26
P27
P28
P29
P30
P31
P32
P33
P34
P35
P36
P37
P38
P39
P40
P41
P42
P43
P44
P45
P46
P47
0 25 50 75 100
Patches with changes to code files:
Patches with no changes to code files:
Increase
Increase
No impact
No impact
Decrease
Decrease
P01
P02
P03
P04
P05
P06
P07
P08
P09
P10
P11
P12
P13
P14
P15
P16
P17
P18
P19
P20
P21
P22
P23
P24
P25
P26
P27
P28
P29
P30
P31
P32
P33
P34
P35
P36
P37
P38
P39
P40
P41
P42
P43
P44
P45
P46
P47
0 25 50 75 100
Patches with changes to code files:
Patches with no changes to code files:
Increase
Increase
No impact
No impact
Decrease
Decrease
Implication for developers: Do not assume patches
leave existing coverage unchanged
Implication for researchers: Do not assume changes
to non-code files do not change behavior
code-coverage.orgASE Sept 5, 2018
Tracking Coverage Over Time
Ideal progression of
coverage
Also possible
progression of
coverage
40% Covered
Version 1
50% Covered
Version 2
60% Covered
Version 3
80% Covered
Version 4
40% Covered 50% Covered 60% Covered 80% Covered
Covered
Not Covered
New idea: what about tracking the
coverage of each statement?
code-coverage.orgASE Sept 5, 2018
RQ: Is it ever the case that coverage
changes in ways we cannot observe using
traditional code coverage metrics?
60% Coverage 60% Coverage
≠
code-coverage.orgASE Sept 5, 2018
Percentage of commits (size of bar) with statements changing coverage (color of
bar) even when the total project coverage did not appear to change.
25 50 75
0 1−10 11−100 101−1,000 1,001+
P01
P02
P03
P04
P05
P06
P07
P08
P09
P10
P11
P12
P13
P14
P15
P16
P17
P18
P19
P20
P21
P22
P23
P24
P25
P26
P27
P28
P29
P30
P31
P32
P33
P34
P35
P36
P37
P38
P39
P40
P41
P42
P43
P44
P45
P46
P47
0 25 50 75 100
0 1−10 11−100 101−1,000 1,001+
Set of lines covered each build can vary
Implication for developers: Do not rely on “steady”
coverage indicating no change to coverage
code-coverage.orgASE Sept 5, 2018
RQ: How does the set of covered lines
change? Are there hot-spots of coverage
change, i.e., lines that flip between being
covered and uncovered throughout
evolution?
int x = 12; int x = 12; int x = 12; int x = 12;
code-coverage.orgASE Sept 5, 2018
Lines often flip coverage state
●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●
●●●●●●●●●●
●●●●●● ●●● ● ●● ●●●●●●●●●●●●●●●●●●●●●● ●●●●● ●●●●● ●●●●● ● ●●●●● ●●● ●● ●●●● ●●●●●●●● ●● ●●●●● ●●●●●●● ●●●●●●●●●●●● ●●●●●●●●●●●●●●●●● ●●●●●●●● ●●●●● ●●●●●●● ●●● ● ●●● ● ●● ●● ●●● ●● ● ●● ● ●●●●●●● ●●● ●●●● ●●
●●●●
●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●● ● ●●●●●● ●●●●●●● ●●●●●●●●●●●●● ●●●●●● ●●●●●●
●●●●●●●●●●●●●●●●●●
●●●●●● ●●●●● ●●●● ●●● ●●● ●● ●●●● ●●●●● ●● ●● ●● ● ●● ●●●● ●●● ●● ●● ●● ● ●●● ●●●● ●●●●●● ●●●● ●●●● ●● ●●● ●● ● ●●●●● ●●●● ● ●● ● ●●●●● ●● ●● ●●●●●● ●● ●●●● ●●● ●● ●●●● ●●●● ●● ●●● ●● ●●● ● ●●● ●●●● ● ●● ●●● ●●●●●●●●●●● ● ●●●● ●● ●● ●● ●●●● ●● ●● ●●● ● ● ●● ●● ●●● ●●●● ●●●●● ●●● ●●●●● ●● ● ●●● ●● ●● ●● ●● ● ●●●● ● ●● ●● ●● ●● ●●●●●● ●● ●● ●● ●●●●● ●●● ●● ● ●● ●●● ●●●● ●●●● ●● ●●● ●● ●●● ●● ●●●● ●●●● ●●●● ●● ●●●● ●●● ●● ●● ●●● ●●●●● ●● ●●●● ●●● ●●● ●●● ●●●●●● ● ●● ●● ●●●●●● ●● ●●● ●●●● ●●● ●●● ●●●●●● ●●● ●●●● ●● ●●●● ●●●● ●●●● ●● ●●● ●●●●● ●●●●●●● ●● ●●● ●●● ● ●●●● ●● ●●● ●●● ●● ●●● ●● ●●●●● ●● ●●●●● ●● ●●● ●● ●● ●●● ●●● ●●● ● ●● ●● ● ●●● ●●● ●●● ●●●● ●● ●● ●●●●● ●●●●●● ●● ●●● ● ●●● ●●●●●● ●● ● ●●●● ● ●● ●●●● ●●●●●●● ●●●● ●●● ●● ●● ● ●●● ●● ●●●● ●●● ●●●● ●●●●● ●●● ●● ●● ●● ●●●● ● ● ●● ●● ●● ● ●● ●●●● ●● ●●● ●●●●● ●●●●● ●●● ●●●●●● ●●●●● ●●●●● ●●●●● ●● ●● ●●●● ●●● ●● ● ●●● ●● ● ● ●●●● ●● ●● ●●●● ●●● ●● ●●●● ●●●● ●●● ●●●●● ●● ● ●●●● ●● ●●● ●● ●● ●●● ● ●●●● ●●●● ●●● ●● ●● ●● ●●● ●●●●● ●●●● ●●● ●● ●● ●●●● ●●●● ●●●●● ●●● ●● ●●●● ●●● ●● ●●● ●● ●●● ●●●●●●● ●● ●●● ●●●●●● ●●●●● ●● ●●● ●● ●● ●● ●● ●● ●● ●●● ●● ●● ●●● ●●●● ●●●● ●● ●●● ●● ●●● ●● ●●● ●●●● ●● ●●● ●●● ●● ● ●●● ●●● ● ●●●● ●● ●● ●●●● ● ●●●●●●●●● ●● ●●● ●●●●● ●● ● ●●●● ●●● ●● ●●● ● ●● ●● ●●● ●●● ●●● ● ●● ●● ●● ●● ●●● ●●●● ●● ●●●● ●● ●●●● ●●● ●●
● ●●●● ●●●● ●● ● ●●●● ●●●●●● ●●● ●●● ●●●● ●●●●● ●●●●● ●●●● ●●●●● ●●●●●●●●●●●●●●●●●●● ●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●● ●●●●● ●●● ●●●●●●●●● ●●●●● ●● ●●●●●●●●●● ●●● ●●●●●●●●●● ● ●●●● ●● ●●●●●● ●●●●●●●●●● ●●●●●●●●●●●●●●●● ●●●● ●●●●●●●
●●
●●● ●●● ●●●●● ●●● ●●● ●●● ●●● ●● ●●●●●●●●●●● ●●●●●●●● ● ●●● ●●● ●●●● ●● ● ●● ●●● ● ●●●●●●●● ●●● ●● ●● ●●●●●● ●●● ●●●●●●●●●● ●●● ●●●●● ●● ●● ●●● ●●●●●●●●● ●●●●●●● ●●●●●●● ●●●●●●●●●●●●●●● ●●●● ●●● ●●●●●●● ●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●● ●●●●● ●●●●●●● ●●●●●●●●●●●●●● ●●●●●● ●●●●●● ●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●● ●●● ●●● ● ●● ●● ●● ●● ●●● ●●●●●●●●● ●●●●●● ● ●●● ●● ●● ●●●●● ●●●● ●● ●●●●●●●●●●● ●● ●●●●●●●●●●●●●●●●●●●●●●●● ●●●●● ●●●●●●●●● ●●● ●● ●●●● ●●●●●●●●● ●● ●●● ●● ● ●● ●● ●●● ●● ● ● ●● ●● ●● ●● ●●●●● ●●●●●●●●●●● ●●●●●●●●●●●●●●●●● ●●●●● ● ●●● ●●●● ●●● ●●●●● ●●●● ●●●●●●●●●●●●●●●●●●●● ●●● ●●●●●●●●●●●● ● ●●●●● ●●● ●●●●●● ●●●● ●●●●●●● ●● ●●●● ●●● ●●●●● ●●●●● ●● ●●●●● ●●●●● ●● ●● ●●●●● ●●●●● ●●●●●●●●●●●● ●●●●●●●●●●●● ●●● ●●●●● ●●●●● ●●●●●● ●●●● ● ●●● ●●●●●● ● ●● ●●●●●●● ● ●● ●● ● ●●● ● ●●●●● ●●● ●●● ●● ●● ●● ●● ●●●●● ●● ●●●● ●●●●● ●● ●●●●●●● ●●●●●●●●●●● ●●●●●●●● ●●●●●● ●● ●● ●● ●● ●●● ●●●●●●●● ●●●●● ●●●●●● ●● ●●● ●● ●●●● ●●● ●●●● ●●●●●● ● ●●●● ●● ●● ● ●●● ● ●●●●●● ●●●●●●●●●●●●●● ●● ●●● ●●●●●●●● ● ●● ●● ●●● ● ●●●● ●● ●●● ● ●● ●●●● ●● ●●●●●● ●● ●●● ●●●● ●●●●●●●●●●● ●●●●●●●●●● ●●●●●●●●●●●●●● ●●●●●● ●●●●● ● ●●●●●●●●●●●● ●● ●● ●●●● ●● ●● ●●●● ●●●● ●●●●● ●●●●●●●●●● ●●●●●●● ●●●● ●●●● ●●●●● ●●●●●●●● ● ●●●●●● ● ●●●●●●●● ●●●●●●●●●● ●● ●●● ●●●●●●●●●●●●●● ●● ●● ●● ● ●●● ●●● ● ●●●● ●●●● ●●●● ●●●● ●●●● ● ●●●●●● ●●●●●●●●●●●●● ●●●●●●●●●●●●● ●●● ●●●● ● ●●●● ●●●●● ●●● ●●●●● ●●● ●● ●●●● ●●●●●● ●●●● ●● ●● ●● ●●●●●●●●●●●●●● ●●●●●●●●●●●●●●● ●●● ●●●● ● ●●●●● ●●●● ●●●●● ●●●● ● ●●●●●●●●●●● ●●●●●●●● ●● ●●●●●●●●●●●●● ●● ●●●● ●● ●●● ●●● ●●●●●● ●● ●● ●●● ●●● ● ● ●●● ●●●●●●●● ●●●●●● ●●●●●●●●●●●●●●●●●●●●●● ●●● ●●●●●●●●●●●●●●●●●●● ●●●● ●●●● ●● ●●● ●●● ●● ●● ●● ●●●●●●●●●●●●●●●●●●● ●● ●●●●●● ●● ●●● ●●● ● ●●●●●●●●●●●●●●●●● ●●●● ● ●●●●● ●● ●● ●●● ●●●● ●●●●●● ●●●●● ●●●●●● ●●●●● ●●●● ● ●●●●●●● ●●●● ●●●● ●●●●●●●● ●●●●●●● ●●●●●● ●●●●●●●● ●●●●●● ●●●● ●●● ●●●●● ●●●●●●●● ●●●● ●●●●● ●●● ●●●●●●● ●●●●●●●●●● ● ● ●●●● ●●●● ●●● ●●●● ●●● ●●●●●●●●●●● ●●●●●●●●●●● ●●● ●●●●●●● ●●●● ●● ● ●● ●● ●● ●●●●●●●● ●●●●● ●●●●● ●●● ●●●●●●● ●●●●●●● ●●●●●●● ●●●●●●●●●●●●●●●● ●●● ●●●● ●●●●●●●●● ●● ●●●●●●●●●● ●●● ●●● ●●● ● ●●● ●●● ● ●●●● ●●●● ●●●● ●●●● ●●● ●●● ●●●● ●●● ●●●●●●● ●●●●●●●●● ●●●●●●●● ●● ●●●●●●●●●●●● ●●●●● ●● ●●●● ●●●● ●●●●● ●●●●●●●●●●●● ●● ●●●●● ●● ●●● ●●●●●● ●●● ●●●●●●●●● ●●●●●●●●●●●●●●●●●●● ●●●●●●●● ●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●● ●●●●● ● ●●●●●●● ●●●●●●●●●●● ●●●●●● ●●●●●● ●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●● ● ● ● ●●● ●● ● ●●●● ●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●● ●●● ●●●●●● ●● ●●●●●●●● ●●●●●● ●●● ●● ●●●● ●●● ●●●●●●●●● ●●● ●●● ●●●●●●● ● ●●●●●●●●● ●● ●●●● ●●●● ●● ●●●●●● ●● ●● ●●● ● ●●● ●● ●●●●●● ●●● ●●● ●●● ●●●●●● ●●● ●●●● ●● ●●● ●●● ● ●● ●●●● ●● ●●● ●● ●●● ●●● ● ●●●● ●● ●●● ●●● ●●●● ●●● ●● ●●● ●●●● ●●● ●●● ●●●● ●●●● ●●●●● ●●●● ●● ●● ●●● ●● ●● ●●●●●●● ●●●● ● ●●●●●●●● ●●●● ●●●●●● ●●●●●●● ●●●● ●●●●● ● ●● ●● ●●●● ●●●●●●●●● ●●●●● ●●●●●● ●●●●●●● ●●●● ●●●●●● ●●●●●●●●●●● ●●●● ●●●●● ●●● ●●●●● ●●● ●●●●●●●●●●●●●●●● ●●● ●●●●● ●● ●●●●●●●●●●●●●●●● ●●●●● ●●●●●● ●●●●●●●● ●● ●●● ● ●● ●● ●●●● ●●● ●●●●●●●●●●● ●●●● ● ●● ●●●● ●●●●●● ● ●● ●●● ●●● ●●●●●●● ●●●●● ● ●●● ●●● ●●●●●●●●●●●●●●● ● ●● ●●●●●●●●● ●●● ●●●●●● ●●●●● ●● ●● ●●● ●●●● ●●● ●●● ●●● ●●●● ●●● ●●●● ●● ●● ●●●● ●●●●●●● ●●●● ●●●● ●●●● ●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●● ●●●●●● ●●● ●●● ● ●●● ●●● ●● ●●● ●●●●●●●●● ●● ●●●●● ●● ●●●●● ●●● ●●●●●● ●● ●●●●● ●●●●● ●●● ●●●●● ●●● ●●●●● ●●●● ● ●●●●● ●●●● ●●● ●●●●●● ● ●● ●●● ●●●●●● ●●● ●●● ● ●●●●●●●●● ● ●●●● ●●● ●●●●●● ●●● ● ●●●● ●●● ●●● ●● ●● ●●●● ●●●●● ●● ● ●●●● ●● ●●● ● ●●●● ●●●●● ●●●●● ●● ●●●●●●● ●● ● ●●●● ●●●●●●●● ●● ●●●●● ●● ●●●●● ●● ●●● ●●●● ●● ● ●●●● ●● ●●● ●●●●● ●●● ●●●●●● ●●●● ●●●● ●●● ●● ●●●● ●●● ●● ●● ●● ●●● ●●●● ●● ●●● ●●●● ●●●●●●● ●●●●●●● ●●●●●● ●● ●●● ●●●●●●●●●●● ●● ●● ● ●● ●● ●● ●●● ●●●●● ●●●●●●● ●●●●●●● ●● ●●● ● ●●● ● ●● ●● ● ● ●● ●●●● ●●● ●●●●● ●●● ●●●●● ●●●● ●●●●● ●● ●●●●●● ●● ●●● ●●● ●●●●● ● ● ●●●● ●●●●● ●●●● ●● ●●● ●● ●●●●●●●●●●●●●●●●● ●● ●● ●●●●● ●●●●● ●● ●●●● ●●● ●● ●● ●● ●●● ●●●●● ●●●●●●●●●● ●●●●●●●●●●●●●●● ●●●●●●●● ●● ●●●● ● ●● ●●●● ●●● ●● ●●●●●●● ●●●● ●●●●●●●●●●● ●●●●●●●●●●●● ● ●● ●●●● ●●● ●● ●●●●●●●● ●●●●● ●●● ●● ●●●● ●● ● ●● ●● ●●●●●●●●●● ●● ● ●● ●●● ● ●●●●●●●●●● ●●●●●●●●● ●●● ●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●● ●●●●●●●●●●● ●●● ●● ●●●●●● ●●●● ● ●● ●●●● ●●● ●●● ●● ●●●●● ●● ●● ●●● ●●●●● ●●●●● ●●●●●●● ● ●●●●● ●●●●● ● ●● ●●● ●●● ●●●●● ●●●●●●● ●●● ●●●●● ●● ●●● ●●● ●●●● ●●●●●●● ●●●● ●● ● ● ●●●● ●● ●● ●●●● ●●●●● ●●● ● ●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●● ●●●●●●●●●●●●●●●● ●●●●●●●●●● ●●●●●●● ●●●●●●●●● ●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●● ●●●●●●●●●●●●●● ●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●● ●● ●● ●●●●● ●●● ●●●●●●●●● ●●●●●●●●●●● ●●●●●●●●●●●●●●●●● ●●●●●●●●●● ●●● ●●●● ●●●●●● ●●● ●● ● ●● ●●●●● ●● ●● ● ●●●● ●●●●● ●●● ●●● ● ●●●● ●●●● ● ●● ●●●● ●●● ● ●● ●●●● ●●● ●●●●●●●●●●● ●●● ● ●●● ●●●●●● ●●●●●● ●●● ●●●● ●●●● ●● ● ●●●●●●● ●● ● ●●●● ●●●●●● ●●● ●●●●●● ●●●● ●● ● ●● ●●●●● ●●●●● ● ● ●● ●●● ●●● ●● ●●●●●● ●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●● ●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ● ●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●● ●●● ●●●●●● ●●●●● ●●● ●● ●●●● ●●● ●●●●●●●●● ●●● ●●●●●● ●●●● ●● ●●●●●●●●●● ● ●● ● ●●●● ●● ●●●● ●●● ●
●●●●●● ●●● ●●●● ●●●●● ●●
●●● ●●● ●● ●●● ●●● ●● ●●●●●●●●●●●●●●●●●●●●●● ● ●● ●● ●●●● ●●●●●● ●● ●● ●●● ●● ●● ●● ●●● ●●● ●●●●●●●● ●●●● ●●●● ● ●●●●●●●●●● ●●● ●● ●●●●●● ●● ●●●● ●●●● ●● ●●●● ●●● ●●● ●● ●● ●●● ●●●●●● ●●●● ●●●●● ●● ●●●● ●● ●●●●●●●●● ●●● ● ●● ●● ●● ●●●●●● ●●●● ●●● ●●●●●●●●● ●●●●● ●●●●●●●●●●●●●●●●● ●●●●● ●●●● ● ●● ●● ● ●●●● ● ● ●●●● ●●●●●●● ●●●● ●●●●●●●● ●●●●●● ●●● ●●●●●●●●● ●● ● ●●●●● ●●●●●●●● ● ●● ●●● ●●●● ●●● ●● ●●● ●● ●●● ●●●● ●●●●● ●● ●●● ●●●● ●● ●●● ●●● ●● ● ●● ●●● ●●●●●●● ●●● ●●● ●● ●●● ●●● ●●●●●●● ●●●●●●●● ●●● ●● ●● ● ●● ●●●●● ●● ●●● ●●●●●●●● ●●●● ●● ●● ●● ●●● ●● ●●●●●●●●● ●● ●● ●●●● ●●●●●●●●●●● ●●● ●●●●●● ●●●● ●●●●●● ●●●●●●● ●● ●●●●●●● ● ●● ●● ●●●●●●● ●● ● ●●●●●●●● ●● ●● ●● ●●●● ●●● ●●● ● ●●●● ● ●●●● ●●●● ●●●● ●● ●●●● ●● ●● ●●● ● ●●● ●●●● ●●●●● ●●●●●● ●●● ●● ●●●● ●● ●●●●●● ●●●●● ●● ●● ●●●● ●● ●●●●● ●●●●●●●● ●● ●● ●●● ●● ●● ●●●●●●●● ●●●●● ●●● ●●● ● ●●● ●●●●●● ●●●●●● ●● ●●●●●●● ●● ● ●●● ●●●●●●●●● ●●●● ● ●●● ●●●●●●●●●● ●● ●●● ● ●●●●●●●●● ●●●● ●●●●●● ● ●●● ●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●● ●●●● ●● ●● ●●●●●●● ●●●●●●●● ●●● ● ●●● ●●●● ● ●●●● ●●●●●●●●●●● ●●●● ●●● ●●● ●●●●●● ●●●●● ●● ●●● ●●●● ●● ●●● ●●●● ●●● ● ●●●●●● ●● ●●●● ●●● ●● ●● ●●●● ●●●●● ●●●●● ●● ● ●●● ●●●●● ●●●●●● ●●● ●●●●●●●● ●● ●● ●●●● ●●●● ●●●●● ●● ●●● ●● ●●● ●●● ●●●●●● ●●●●●● ●● ●● ●● ●●●●●●●●●● ●● ●●●● ● ●●●●●●● ●● ●● ●●● ●● ●● ●●●●●●● ●●●● ●●●●● ●●● ●●●●●● ● ● ●●●● ●●● ●●● ●●●●● ●● ●●●
● ●●●● ●● ● ●●● ●●●●●● ●●●●●● ●●●●●● ● ●●● ●●●●●● ●● ●●● ●●●● ●●●●●●● ●●●●●●●● ●●●● ●● ●●● ●●●●●● ●●●● ●● ●● ●●●● ●●
●●●● ●● ●●●●●●●●●●●●●●●● ●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●● ●●●●●●● ●● ●●●●●●● ●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●● ●●●●● ●●●●●● ●● ●●● ●●●●●●●●●●● ●●●●●●●●●●●● ●●●
● ●● ● ●●● ●●●●●●● ●● ●●● ●●● ●●●●●●●●●●●●●●●●● ●●●●●●●●●●● ●●●●● ●●●● ●●●● ●●●● ● ●●●●●● ●● ●●●●● ●●●● ●●●●●●●●●●● ●●● ● ●●●● ●●●●●● ●●●● ●● ●●●●●● ●●● ●● ●●● ●●●●●● ● ●●● ●●● ●●●● ●● ●● ●●● ●●● ●● ●● ●● ●● ●●● ●● ● ●● ●●● ●●● ●● ●●● ●●● ● ●●● ● ●●● ●●●●● ●●● ●● ●●●●●●●●●●●● ●● ●●● ●●● ●● ●● ●●●● ●●●●●● ●●●●●●●● ●●●● ●● ●● ●●●●●● ● ● ●● ●●● ●●●●● ● ●●●● ●●●● ●● ●●● ●●●●●● ● ●●●●●●●●●●●● ●●● ●●● ●● ●●● ●●● ●● ●● ●●● ●● ● ●● ●●●●●● ●●● ● ●● ●● ●● ●●●● ●●● ● ● ●● ●● ●●● ●● ● ●●●● ●● ●● ●
●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●● ●●● ●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●● ●●● ●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●● ●●●●●●●●●●●●●●●●●●●●●●● ●●●
●● ●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●
●●●●●●●●●●
●●●●●● ●●● ● ●● ●●●●●●●●●●●●●●●●●●●●●● ●●●●● ●●●●● ●●●●● ● ●●●●● ●●● ●● ●●●● ●●●●●●●● ●● ●●●●● ●●●●●●● ●●●●●●●●●●●● ●●●●●●●●●●●●●●●●● ●●●●●●●● ●●●●● ●●●●●●● ●●● ● ●●● ● ●● ●● ●●● ●● ● ●● ● ●●●●●●● ●●● ●●●● ●●
●●●●
●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●● ● ●●●●●● ●●●●●●● ●●●●●●●●●●●●● ●●●●●● ●●●●●●
●●●●●●●●●●●●●●●●●●
●●●●●● ●●●●● ●●●● ●●● ●●● ●● ●●●● ●●●●● ●● ●● ●● ● ●● ●●●● ●●● ●● ●● ●● ● ●●● ●●●● ●●●●●● ●●●● ●●●● ●● ●●● ●● ● ●●●●● ●●●● ● ●● ● ●●●●● ●● ●● ●●●●●● ●● ●●●● ●●● ●● ●●●● ●●●● ●● ●●● ●● ●●● ● ●●● ●●●● ● ●● ●●● ●●●●●●●●●●● ● ●●●● ●● ●● ●● ●●●● ●● ●● ●●● ● ● ●● ●● ●●● ●●●● ●●●●● ●●● ●●●●● ●● ● ●●● ●● ●● ●● ●● ● ●●●● ● ●● ●● ●● ●● ●●●●●● ●● ●● ●● ●●●●● ●●● ●● ● ●● ●●● ●●●● ●●●● ●● ●●● ●● ●●● ●● ●●●● ●●●● ●●●● ●● ●●●● ●●● ●● ●● ●●● ●●●●● ●● ●●●● ●●● ●●● ●●● ●●●●●● ● ●● ●● ●●●●●● ●● ●●● ●●●● ●●● ●●● ●●●●●● ●●● ●●●● ●● ●●●● ●●●● ●●●● ●● ●●● ●●●●● ●●●●●●● ●● ●●● ●●● ● ●●●● ●● ●●● ●●● ●● ●●● ●● ●●●●● ●● ●●●●● ●● ●●● ●● ●● ●●● ●●● ●●● ● ●● ●● ● ●●● ●●● ●●● ●●●● ●● ●● ●●●●● ●●●●●● ●● ●●● ● ●●● ●●●●●● ●● ● ●●●● ● ●● ●●●● ●●●●●●● ●●●● ●●● ●● ●● ● ●●● ●● ●●●● ●●● ●●●● ●●●●● ●●● ●● ●● ●● ●●●● ● ● ●● ●● ●● ● ●● ●●●● ●● ●●● ●●●●● ●●●●● ●●● ●●●●●● ●●●●● ●●●●● ●●●●● ●● ●● ●●●● ●●● ●● ● ●●● ●● ● ● ●●●● ●● ●● ●●●● ●●● ●● ●●●● ●●●● ●●● ●●●●● ●● ● ●●●● ●● ●●● ●● ●● ●●● ● ●●●● ●●●● ●●● ●● ●● ●● ●●● ●●●●● ●●●● ●●● ●● ●● ●●●● ●●●● ●●●●● ●●● ●● ●●●● ●●● ●● ●●● ●● ●●● ●●●●●●● ●● ●●● ●●●●●● ●●●●● ●● ●●● ●● ●● ●● ●● ●● ●● ●●● ●● ●● ●●● ●●●● ●●●● ●● ●●● ●● ●●● ●● ●●● ●●●● ●● ●●● ●●● ●● ● ●●● ●●● ● ●●●● ●● ●● ●●●● ● ●●●●●●●●● ●● ●●● ●●●●● ●● ● ●●●● ●●● ●● ●●● ● ●● ●● ●●● ●●● ●●● ● ●● ●● ●● ●● ●●● ●●●● ●● ●●●● ●● ●●●● ●●● ●●
● ●●●● ●●●● ●● ● ●●●● ●●●●●● ●●● ●●● ●●●● ●●●●● ●●●●● ●●●● ●●●●● ●●●●●●●●●●●●●●●●●●● ●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●● ●●●●● ●●● ●●●●●●●●● ●●●●● ●● ●●●●●●●●●● ●●● ●●●●●●●●●● ● ●●●● ●● ●●●●●● ●●●●●●●●●● ●●●●●●●●●●●●●●●● ●●●● ●●●●●●●
●●
●●● ●●● ●●●●● ●●● ●●● ●●● ●●● ●● ●●●●●●●●●●● ●●●●●●●● ● ●●● ●●● ●●●● ●● ● ●● ●●● ● ●●●●●●●● ●●● ●● ●● ●●●●●● ●●● ●●●●●●●●●● ●●● ●●●●● ●● ●● ●●● ●●●●●●●●● ●●●●●●● ●●●●●●● ●●●●●●●●●●●●●●● ●●●● ●●● ●●●●●●● ●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●● ●●●●● ●●●●●●● ●●●●●●●●●●●●●● ●●●●●● ●●●●●● ●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●● ●●● ●●● ● ●● ●● ●● ●● ●●● ●●●●●●●●● ●●●●●● ● ●●● ●● ●● ●●●●● ●●●● ●● ●●●●●●●●●●● ●● ●●●●●●●●●●●●●●●●●●●●●●●● ●●●●● ●●●●●●●●● ●●● ●● ●●●● ●●●●●●●●● ●● ●●● ●● ● ●● ●● ●●● ●● ● ● ●● ●● ●● ●● ●●●●● ●●●●●●●●●●● ●●●●●●●●●●●●●●●●● ●●●●● ● ●●● ●●●● ●●● ●●●●● ●●●● ●●●●●●●●●●●●●●●●●●●● ●●● ●●●●●●●●●●●● ● ●●●●● ●●● ●●●●●● ●●●● ●●●●●●● ●● ●●●● ●●● ●●●●● ●●●●● ●● ●●●●● ●●●●● ●● ●● ●●●●● ●●●●● ●●●●●●●●●●●● ●●●●●●●●●●●● ●●● ●●●●● ●●●●● ●●●●●● ●●●● ● ●●● ●●●●●● ● ●● ●●●●●●● ● ●● ●● ● ●●● ● ●●●●● ●●● ●●● ●● ●● ●● ●● ●●●●● ●● ●●●● ●●●●● ●● ●●●●●●● ●●●●●●●●●●● ●●●●●●●● ●●●●●● ●● ●● ●● ●● ●●● ●●●●●●●● ●●●●● ●●●●●● ●● ●●● ●● ●●●● ●●● ●●●● ●●●●●● ● ●●●● ●● ●● ● ●●● ● ●●●●●● ●●●●●●●●●●●●●● ●● ●●● ●●●●●●●● ● ●● ●● ●●● ● ●●●● ●● ●●● ● ●● ●●●● ●● ●●●●●● ●● ●●● ●●●● ●●●●●●●●●●● ●●●●●●●●●● ●●●●●●●●●●●●●● ●●●●●● ●●●●● ● ●●●●●●●●●●●● ●● ●● ●●●● ●● ●● ●●●● ●●●● ●●●●● ●●●●●●●●●● ●●●●●●● ●●●● ●●●● ●●●●● ●●●●●●●● ● ●●●●●● ● ●●●●●●●● ●●●●●●●●●● ●● ●●● ●●●●●●●●●●●●●● ●● ●● ●● ● ●●● ●●● ● ●●●● ●●●● ●●●● ●●●● ●●●● ● ●●●●●● ●●●●●●●●●●●●● ●●●●●●●●●●●●● ●●● ●●●● ● ●●●● ●●●●● ●●● ●●●●● ●●● ●● ●●●● ●●●●●● ●●●● ●● ●● ●● ●●●●●●●●●●●●●● ●●●●●●●●●●●●●●● ●●● ●●●● ● ●●●●● ●●●● ●●●●● ●●●● ● ●●●●●●●●●●● ●●●●●●●● ●● ●●●●●●●●●●●●● ●● ●●●● ●● ●●● ●●● ●●●●●● ●● ●● ●●● ●●● ● ● ●●● ●●●●●●●● ●●●●●● ●●●●●●●●●●●●●●●●●●●●●● ●●● ●●●●●●●●●●●●●●●●●●● ●●●● ●●●● ●● ●●● ●●● ●● ●● ●● ●●●●●●●●●●●●●●●●●●● ●● ●●●●●● ●● ●●● ●●● ● ●●●●●●●●●●●●●●●●● ●●●● ● ●●●●● ●● ●● ●●● ●●●● ●●●●●● ●●●●● ●●●●●● ●●●●● ●●●● ● ●●●●●●● ●●●● ●●●● ●●●●●●●● ●●●●●●● ●●●●●● ●●●●●●●● ●●●●●● ●●●● ●●● ●●●●● ●●●●●●●● ●●●● ●●●●● ●●● ●●●●●●● ●●●●●●●●●● ● ● ●●●● ●●●● ●●● ●●●● ●●● ●●●●●●●●●●● ●●●●●●●●●●● ●●● ●●●●●●● ●●●● ●● ● ●● ●● ●● ●●●●●●●● ●●●●● ●●●●● ●●● ●●●●●●● ●●●●●●● ●●●●●●● ●●●●●●●●●●●●●●●● ●●● ●●●● ●●●●●●●●● ●● ●●●●●●●●●● ●●● ●●● ●●● ● ●●● ●●● ● ●●●● ●●●● ●●●● ●●●● ●●● ●●● ●●●● ●●● ●●●●●●● ●●●●●●●●● ●●●●●●●● ●● ●●●●●●●●●●●● ●●●●● ●● ●●●● ●●●● ●●●●● ●●●●●●●●●●●● ●● ●●●●● ●● ●●● ●●●●●● ●●● ●●●●●●●●● ●●●●●●●●●●●●●●●●●●● ●●●●●●●● ●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●● ●●●●● ● ●●●●●●● ●●●●●●●●●●● ●●●●●● ●●●●●● ●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●● ● ● ● ●●● ●● ● ●●●● ●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●● ●●● ●●●●●● ●● ●●●●●●●● ●●●●●● ●●● ●● ●●●● ●●● ●●●●●●●●● ●●● ●●● ●●●●●●● ● ●●●●●●●●● ●● ●●●● ●●●● ●● ●●●●●● ●● ●● ●●● ● ●●● ●● ●●●●●● ●●● ●●● ●●● ●●●●●● ●●● ●●●● ●● ●●● ●●● ● ●● ●●●● ●● ●●● ●● ●●● ●●● ● ●●●● ●● ●●● ●●● ●●●● ●●● ●● ●●● ●●●● ●●● ●●● ●●●● ●●●● ●●●●● ●●●● ●● ●● ●●● ●● ●● ●●●●●●● ●●●● ● ●●●●●●●● ●●●● ●●●●●● ●●●●●●● ●●●● ●●●●● ● ●● ●● ●●●● ●●●●●●●●● ●●●●● ●●●●●● ●●●●●●● ●●●● ●●●●●● ●●●●●●●●●●● ●●●● ●●●●● ●●● ●●●●● ●●● ●●●●●●●●●●●●●●●● ●●● ●●●●● ●● ●●●●●●●●●●●●●●●● ●●●●● ●●●●●● ●●●●●●●● ●● ●●● ● ●● ●● ●●●● ●●● ●●●●●●●●●●● ●●●● ● ●● ●●●● ●●●●●● ● ●● ●●● ●●● ●●●●●●● ●●●●● ● ●●● ●●● ●●●●●●●●●●●●●●● ● ●● ●●●●●●●●● ●●● ●●●●●● ●●●●● ●● ●● ●●● ●●●● ●●● ●●● ●●● ●●●● ●●● ●●●● ●● ●● ●●●● ●●●●●●● ●●●● ●●●● ●●●● ●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●● ●●●●●● ●●● ●●● ● ●●● ●●● ●● ●●● ●●●●●●●●● ●● ●●●●● ●● ●●●●● ●●● ●●●●●● ●● ●●●●● ●●●●● ●●● ●●●●● ●●● ●●●●● ●●●● ● ●●●●● ●●●● ●●● ●●●●●● ● ●● ●●● ●●●●●● ●●● ●●● ● ●●●●●●●●● ● ●●●● ●●● ●●●●●● ●●● ● ●●●● ●●● ●●● ●● ●● ●●●● ●●●●● ●● ● ●●●● ●● ●●● ● ●●●● ●●●●● ●●●●● ●● ●●●●●●● ●● ● ●●●● ●●●●●●●● ●● ●●●●● ●● ●●●●● ●● ●●● ●●●● ●● ● ●●●● ●● ●●● ●●●●● ●●● ●●●●●● ●●●● ●●●● ●●● ●● ●●●● ●●● ●● ●● ●● ●●● ●●●● ●● ●●● ●●●● ●●●●●●● ●●●●●●● ●●●●●● ●● ●●● ●●●●●●●●●●● ●● ●● ● ●● ●● ●● ●●● ●●●●● ●●●●●●● ●●●●●●● ●● ●●● ● ●●● ● ●● ●● ● ● ●● ●●●● ●●● ●●●●● ●●● ●●●●● ●●●● ●●●●● ●● ●●●●●● ●● ●●● ●●● ●●●●● ● ● ●●●● ●●●●● ●●●● ●● ●●● ●● ●●●●●●●●●●●●●●●●● ●● ●● ●●●●● ●●●●● ●● ●●●● ●●● ●● ●● ●● ●●● ●●●●● ●●●●●●●●●● ●●●●●●●●●●●●●●● ●●●●●●●● ●● ●●●● ● ●● ●●●● ●●● ●● ●●●●●●● ●●●● ●●●●●●●●●●● ●●●●●●●●●●●● ● ●● ●●●● ●●● ●● ●●●●●●●● ●●●●● ●●● ●● ●●●● ●● ● ●● ●● ●●●●●●●●●● ●● ● ●● ●●● ● ●●●●●●●●●● ●●●●●●●●● ●●● ●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●● ●●●●●●●●●●● ●●● ●● ●●●●●● ●●●● ● ●● ●●●● ●●● ●●● ●● ●●●●● ●● ●● ●●● ●●●●● ●●●●● ●●●●●●● ● ●●●●● ●●●●● ● ●● ●●● ●●● ●●●●● ●●●●●●● ●●● ●●●●● ●● ●●● ●●● ●●●● ●●●●●●● ●●●● ●● ● ● ●●●● ●● ●● ●●●● ●●●●● ●●● ● ●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●● ●●●●●●●●●●●●●●●● ●●●●●●●●●● ●●●●●●● ●●●●●●●●● ●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●● ●●●●●●●●●●●●●● ●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●● ●● ●● ●●●●● ●●● ●●●●●●●●● ●●●●●●●●●●● ●●●●●●●●●●●●●●●●● ●●●●●●●●●● ●●● ●●●● ●●●●●● ●●● ●● ● ●● ●●●●● ●● ●● ● ●●●● ●●●●● ●●● ●●● ● ●●●● ●●●● ● ●● ●●●● ●●● ● ●● ●●●● ●●● ●●●●●●●●●●● ●●● ● ●●● ●●●●●● ●●●●●● ●●● ●●●● ●●●● ●● ● ●●●●●●● ●● ● ●●●● ●●●●●● ●●● ●●●●●● ●●●● ●● ● ●● ●●●●● ●●●●● ● ● ●● ●●● ●●● ●● ●●●●●● ●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●● ●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ● ●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●● ●●● ●●●●●● ●●●●● ●●● ●● ●●●● ●●● ●●●●●●●●● ●●● ●●●●●● ●●●● ●● ●●●●●●●●●● ● ●● ● ●●●● ●● ●●●● ●●● ●
●●●●●● ●●● ●●●● ●●●●● ●●
●●● ●●● ●● ●●● ●●● ●● ●●●●●●●●●●●●●●●●●●●●●● ● ●● ●● ●●●● ●●●●●● ●● ●● ●●● ●● ●● ●● ●●● ●●● ●●●●●●●● ●●●● ●●●● ● ●●●●●●●●●● ●●● ●● ●●●●●● ●● ●●●● ●●●● ●● ●●●● ●●● ●●● ●● ●● ●●● ●●●●●● ●●●● ●●●●● ●● ●●●● ●● ●●●●●●●●● ●●● ● ●● ●● ●● ●●●●●● ●●●● ●●● ●●●●●●●●● ●●●●● ●●●●●●●●●●●●●●●●● ●●●●● ●●●● ● ●● ●● ● ●●●● ● ● ●●●● ●●●●●●● ●●●● ●●●●●●●● ●●●●●● ●●● ●●●●●●●●● ●● ● ●●●●● ●●●●●●●● ● ●● ●●● ●●●● ●●● ●● ●●● ●● ●●● ●●●● ●●●●● ●● ●●● ●●●● ●● ●●● ●●● ●● ● ●● ●●● ●●●●●●● ●●● ●●● ●● ●●● ●●● ●●●●●●● ●●●●●●●● ●●● ●● ●● ● ●● ●●●●● ●● ●●● ●●●●●●●● ●●●● ●● ●● ●● ●●● ●● ●●●●●●●●● ●● ●● ●●●● ●●●●●●●●●●● ●●● ●●●●●● ●●●● ●●●●●● ●●●●●●● ●● ●●●●●●● ● ●● ●● ●●●●●●● ●● ● ●●●●●●●● ●● ●● ●● ●●●● ●●● ●●● ● ●●●● ● ●●●● ●●●● ●●●● ●● ●●●● ●● ●● ●●● ● ●●● ●●●● ●●●●● ●●●●●● ●●● ●● ●●●● ●● ●●●●●● ●●●●● ●● ●● ●●●● ●● ●●●●● ●●●●●●●● ●● ●● ●●● ●● ●● ●●●●●●●● ●●●●● ●●● ●●● ● ●●● ●●●●●● ●●●●●● ●● ●●●●●●● ●● ● ●●● ●●●●●●●●● ●●●● ● ●●● ●●●●●●●●●● ●● ●●● ● ●●●●●●●●● ●●●● ●●●●●● ● ●●● ●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●● ●●●● ●● ●● ●●●●●●● ●●●●●●●● ●●● ● ●●● ●●●● ● ●●●● ●●●●●●●●●●● ●●●● ●●● ●●● ●●●●●● ●●●●● ●● ●●● ●●●● ●● ●●● ●●●● ●●● ● ●●●●●● ●● ●●●● ●●● ●● ●● ●●●● ●●●●● ●●●●● ●● ● ●●● ●●●●● ●●●●●● ●●● ●●●●●●●● ●● ●● ●●●● ●●●● ●●●●● ●● ●●● ●● ●●● ●●● ●●●●●● ●●●●●● ●● ●● ●● ●●●●●●●●●● ●● ●●●● ● ●●●●●●● ●● ●● ●●● ●● ●● ●●●●●●● ●●●● ●●●●● ●●● ●●●●●● ● ● ●●●● ●●● ●●● ●●●●● ●● ●●●
● ●●●● ●● ● ●●● ●●●●●● ●●●●●● ●●●●●● ● ●●● ●●●●●● ●● ●●● ●●●● ●●●●●●● ●●●●●●●● ●●●● ●● ●●● ●●●●●● ●●●● ●● ●● ●●●● ●●
●●●● ●● ●●●●●●●●●●●●●●●● ●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●● ●●●●●●● ●● ●●●●●●● ●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●● ●●●●● ●●●●●● ●● ●●● ●●●●●●●●●●● ●●●●●●●●●●●● ●●●
● ●● ● ●●● ●●●●●●● ●● ●●● ●●● ●●●●●●●●●●●●●●●●● ●●●●●●●●●●● ●●●●● ●●●● ●●●● ●●●● ● ●●●●●● ●● ●●●●● ●●●● ●●●●●●●●●●● ●●● ● ●●●● ●●●●●● ●●●● ●● ●●●●●● ●●● ●● ●●● ●●●●●● ● ●●● ●●● ●●●● ●● ●● ●●● ●●● ●● ●● ●● ●● ●●● ●● ● ●● ●●● ●●● ●● ●●● ●●● ● ●●● ● ●●● ●●●●● ●●● ●● ●●●●●●●●●●●● ●● ●●● ●●● ●● ●● ●●●● ●●●●●● ●●●●●●●● ●●●● ●● ●● ●●●●●● ● ● ●● ●●● ●●●●● ● ●●●● ●●●● ●● ●●● ●●●●●● ● ●●●●●●●●●●●● ●●● ●●● ●● ●●● ●●● ●● ●● ●●● ●● ● ●● ●●●●●● ●●● ● ●● ●● ●● ●●●● ●●● ● ● ●● ●● ●●● ●● ● ●●●● ●● ●● ●
●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●● ●●● ●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●● ●●● ●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●● ●●●●●●●●●●●●●●●●●●●●●●● ●●●
●● ●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●
P01
P02
P03
P04
P05
P06
P07
P08
P09
P10
P11
P12
P13
P14
P15
P17
P18
P19
P20
P21
P22
P24
P25
P26
P27
P28
P29
P30
P31
P32
P33
P34
P35
P36
P38
P39
P40
P41
P42
P43
P44
P45
P46
P47
25 50 75 100 125
Implication for all: Coverage can be non-deterministic
(flaky). Tools and methods for using coverage must
consider this
code-coverage.orgASE Sept 5, 2018
RQ: What are the reasons for coverage changes?
Does code coverage change because old code
becomes tested, or because new, tested code is
added? Or, does deleting lines drive changes to
code coverage?
A Large-Scale Study of Test Coverage Evolution
A Large-Scale Study of Test Coverage Evolution
A Large-Scale Study of Test Coverage Evolution
A Large-Scale Study of Test Coverage Evolution
A Large-Scale Study of Test Coverage Evolution

More Related Content

Similar to A Large-Scale Study of Test Coverage Evolution

Comparing public RNA-seq data
Comparing public RNA-seq dataComparing public RNA-seq data
Comparing public RNA-seq datamikaelhuss
 
GSC in HUB_Kaikai Yang / COO, Energo Labs
GSC in HUB_Kaikai Yang / COO, Energo LabsGSC in HUB_Kaikai Yang / COO, Energo Labs
GSC in HUB_Kaikai Yang / COO, Energo LabsVentureSquare
 
Deep dive into Nagios analytics
Deep dive into Nagios analyticsDeep dive into Nagios analytics
Deep dive into Nagios analyticsDatadog
 
Spray Democamp Dresden 2011-11-08
Spray Democamp Dresden 2011-11-08Spray Democamp Dresden 2011-11-08
Spray Democamp Dresden 2011-11-08joergreichert
 
Aiello-Lammens: Global Sensitivity Analysis for Impact Assessments.
Aiello-Lammens:  Global Sensitivity Analysis for Impact Assessments.Aiello-Lammens:  Global Sensitivity Analysis for Impact Assessments.
Aiello-Lammens: Global Sensitivity Analysis for Impact Assessments.questRCN
 
Community dynamics of the adolescent vaginal microbiome during puberty (UOreg...
Community dynamics of the adolescent vaginal microbiome during puberty (UOreg...Community dynamics of the adolescent vaginal microbiome during puberty (UOreg...
Community dynamics of the adolescent vaginal microbiome during puberty (UOreg...Roxana Hickey
 
Gemeinsam kreativ für bessere Software - Vortragsreihe Dortmund
Gemeinsam kreativ für bessere Software - Vortragsreihe DortmundGemeinsam kreativ für bessere Software - Vortragsreihe Dortmund
Gemeinsam kreativ für bessere Software - Vortragsreihe Dortmunditemis AG
 
Fairisle knitting
Fairisle knittingFairisle knitting
Fairisle knittingzafiro555
 
Entwicklung in Spielen als Innovationstreiber für Usability
Entwicklung in Spielen als Innovationstreiber für UsabilityEntwicklung in Spielen als Innovationstreiber für Usability
Entwicklung in Spielen als Innovationstreiber für Usabilityitemis AG
 
Entwicklungen in Spielen als Innovationstreiber für Usability
Entwicklungen in Spielen als Innovationstreiber für UsabilityEntwicklungen in Spielen als Innovationstreiber für Usability
Entwicklungen in Spielen als Innovationstreiber für UsabilityMichael Jendryschik
 
正誤表 p39
正誤表 p39正誤表 p39
正誤表 p39zafiro555
 
データ社会を生きる技術〜人工知能のHypeとHope〜
データ社会を生きる技術〜人工知能のHypeとHope〜データ社会を生きる技術〜人工知能のHypeとHope〜
データ社会を生きる技術〜人工知能のHypeとHope〜Ichigaku Takigawa
 
Building Flexible APIs with Spring HATEOAS
Building Flexible APIs with Spring HATEOASBuilding Flexible APIs with Spring HATEOAS
Building Flexible APIs with Spring HATEOASVMware Tanzu
 
The Ecology of Forage Fish in the Salish Sea
The Ecology of Forage Fish in the Salish SeaThe Ecology of Forage Fish in the Salish Sea
The Ecology of Forage Fish in the Salish SeaTessa Francis
 
アイ・トレーニング10点)
アイ・トレーニング10点)アイ・トレーニング10点)
アイ・トレーニング10点)kenji sakuma
 
Will data scientists lead the discovery of cancer therapeutics?
Will data scientists lead the discovery of cancer therapeutics?Will data scientists lead the discovery of cancer therapeutics?
Will data scientists lead the discovery of cancer therapeutics?Laura Berry
 
Innovation & Issue process
Innovation & Issue processInnovation & Issue process
Innovation & Issue processKatsuhito Okada
 
Pocket dot grid pages
Pocket dot grid pagesPocket dot grid pages
Pocket dot grid pagesHIKOO
 
機械学習~データを予測に変える技術~で化学に挑む! (サイエンスアゴラ2021)
機械学習~データを予測に変える技術~で化学に挑む! (サイエンスアゴラ2021)機械学習~データを予測に変える技術~で化学に挑む! (サイエンスアゴラ2021)
機械学習~データを予測に変える技術~で化学に挑む! (サイエンスアゴラ2021)Ichigaku Takigawa
 

Similar to A Large-Scale Study of Test Coverage Evolution (20)

Comparing public RNA-seq data
Comparing public RNA-seq dataComparing public RNA-seq data
Comparing public RNA-seq data
 
GSC in HUB_Kaikai Yang / COO, Energo Labs
GSC in HUB_Kaikai Yang / COO, Energo LabsGSC in HUB_Kaikai Yang / COO, Energo Labs
GSC in HUB_Kaikai Yang / COO, Energo Labs
 
Deep dive into Nagios analytics
Deep dive into Nagios analyticsDeep dive into Nagios analytics
Deep dive into Nagios analytics
 
Spray Democamp Dresden 2011-11-08
Spray Democamp Dresden 2011-11-08Spray Democamp Dresden 2011-11-08
Spray Democamp Dresden 2011-11-08
 
Aiello-Lammens: Global Sensitivity Analysis for Impact Assessments.
Aiello-Lammens:  Global Sensitivity Analysis for Impact Assessments.Aiello-Lammens:  Global Sensitivity Analysis for Impact Assessments.
Aiello-Lammens: Global Sensitivity Analysis for Impact Assessments.
 
Community dynamics of the adolescent vaginal microbiome during puberty (UOreg...
Community dynamics of the adolescent vaginal microbiome during puberty (UOreg...Community dynamics of the adolescent vaginal microbiome during puberty (UOreg...
Community dynamics of the adolescent vaginal microbiome during puberty (UOreg...
 
Gemeinsam kreativ für bessere Software - Vortragsreihe Dortmund
Gemeinsam kreativ für bessere Software - Vortragsreihe DortmundGemeinsam kreativ für bessere Software - Vortragsreihe Dortmund
Gemeinsam kreativ für bessere Software - Vortragsreihe Dortmund
 
Fairisle knitting
Fairisle knittingFairisle knitting
Fairisle knitting
 
Entwicklung in Spielen als Innovationstreiber für Usability
Entwicklung in Spielen als Innovationstreiber für UsabilityEntwicklung in Spielen als Innovationstreiber für Usability
Entwicklung in Spielen als Innovationstreiber für Usability
 
Entwicklungen in Spielen als Innovationstreiber für Usability
Entwicklungen in Spielen als Innovationstreiber für UsabilityEntwicklungen in Spielen als Innovationstreiber für Usability
Entwicklungen in Spielen als Innovationstreiber für Usability
 
正誤表 p39
正誤表 p39正誤表 p39
正誤表 p39
 
データ社会を生きる技術〜人工知能のHypeとHope〜
データ社会を生きる技術〜人工知能のHypeとHope〜データ社会を生きる技術〜人工知能のHypeとHope〜
データ社会を生きる技術〜人工知能のHypeとHope〜
 
Building Flexible APIs with Spring HATEOAS
Building Flexible APIs with Spring HATEOASBuilding Flexible APIs with Spring HATEOAS
Building Flexible APIs with Spring HATEOAS
 
The Ecology of Forage Fish in the Salish Sea
The Ecology of Forage Fish in the Salish SeaThe Ecology of Forage Fish in the Salish Sea
The Ecology of Forage Fish in the Salish Sea
 
アイ・トレーニング10点)
アイ・トレーニング10点)アイ・トレーニング10点)
アイ・トレーニング10点)
 
Will data scientists lead the discovery of cancer therapeutics?
Will data scientists lead the discovery of cancer therapeutics?Will data scientists lead the discovery of cancer therapeutics?
Will data scientists lead the discovery of cancer therapeutics?
 
Innovation & Issue process
Innovation & Issue processInnovation & Issue process
Innovation & Issue process
 
Pocket dot grid pages
Pocket dot grid pagesPocket dot grid pages
Pocket dot grid pages
 
17 polishing
17 polishing17 polishing
17 polishing
 
機械学習~データを予測に変える技術~で化学に挑む! (サイエンスアゴラ2021)
機械学習~データを予測に変える技術~で化学に挑む! (サイエンスアゴラ2021)機械学習~データを予測に変える技術~で化学に挑む! (サイエンスアゴラ2021)
機械学習~データを予測に変える技術~で化学に挑む! (サイエンスアゴラ2021)
 

More from jon_bell

Replay without Recording of Production Bugs for Service Oriented Applications
Replay without Recording of Production Bugs for Service Oriented ApplicationsReplay without Recording of Production Bugs for Service Oriented Applications
Replay without Recording of Production Bugs for Service Oriented Applicationsjon_bell
 
CROCHET - Checkpoint Rollback in JVM (ECOOP 2018)
CROCHET - Checkpoint Rollback in JVM (ECOOP 2018)CROCHET - Checkpoint Rollback in JVM (ECOOP 2018)
CROCHET - Checkpoint Rollback in JVM (ECOOP 2018)jon_bell
 
Efficient Dependency Detection for Safe Java Test Acceleration
Efficient Dependency Detection for Safe Java Test AccelerationEfficient Dependency Detection for Safe Java Test Acceleration
Efficient Dependency Detection for Safe Java Test Accelerationjon_bell
 
Phosphor: Illuminating Dynamic Data Flow in Commodity JVMs
Phosphor: Illuminating Dynamic Data Flow in Commodity JVMsPhosphor: Illuminating Dynamic Data Flow in Commodity JVMs
Phosphor: Illuminating Dynamic Data Flow in Commodity JVMsjon_bell
 
ICSE 2014: Unit Test Virtualization with VMVM
ICSE 2014: Unit Test Virtualization with VMVMICSE 2014: Unit Test Virtualization with VMVM
ICSE 2014: Unit Test Virtualization with VMVMjon_bell
 
Unit Test Virtualization: Optimizing Testing Time
Unit Test Virtualization: Optimizing Testing TimeUnit Test Virtualization: Optimizing Testing Time
Unit Test Virtualization: Optimizing Testing Timejon_bell
 
Chronicler: Lightweight Recording to Reproduce Field Failures (Presented at I...
Chronicler: Lightweight Recording to Reproduce Field Failures (Presented at I...Chronicler: Lightweight Recording to Reproduce Field Failures (Presented at I...
Chronicler: Lightweight Recording to Reproduce Field Failures (Presented at I...jon_bell
 
A Large-Scale, Longitudinal Study of User Profiles in World of Warcraft
A Large-Scale, Longitudinal Study of User Profiles in World of WarcraftA Large-Scale, Longitudinal Study of User Profiles in World of Warcraft
A Large-Scale, Longitudinal Study of User Profiles in World of Warcraftjon_bell
 

More from jon_bell (8)

Replay without Recording of Production Bugs for Service Oriented Applications
Replay without Recording of Production Bugs for Service Oriented ApplicationsReplay without Recording of Production Bugs for Service Oriented Applications
Replay without Recording of Production Bugs for Service Oriented Applications
 
CROCHET - Checkpoint Rollback in JVM (ECOOP 2018)
CROCHET - Checkpoint Rollback in JVM (ECOOP 2018)CROCHET - Checkpoint Rollback in JVM (ECOOP 2018)
CROCHET - Checkpoint Rollback in JVM (ECOOP 2018)
 
Efficient Dependency Detection for Safe Java Test Acceleration
Efficient Dependency Detection for Safe Java Test AccelerationEfficient Dependency Detection for Safe Java Test Acceleration
Efficient Dependency Detection for Safe Java Test Acceleration
 
Phosphor: Illuminating Dynamic Data Flow in Commodity JVMs
Phosphor: Illuminating Dynamic Data Flow in Commodity JVMsPhosphor: Illuminating Dynamic Data Flow in Commodity JVMs
Phosphor: Illuminating Dynamic Data Flow in Commodity JVMs
 
ICSE 2014: Unit Test Virtualization with VMVM
ICSE 2014: Unit Test Virtualization with VMVMICSE 2014: Unit Test Virtualization with VMVM
ICSE 2014: Unit Test Virtualization with VMVM
 
Unit Test Virtualization: Optimizing Testing Time
Unit Test Virtualization: Optimizing Testing TimeUnit Test Virtualization: Optimizing Testing Time
Unit Test Virtualization: Optimizing Testing Time
 
Chronicler: Lightweight Recording to Reproduce Field Failures (Presented at I...
Chronicler: Lightweight Recording to Reproduce Field Failures (Presented at I...Chronicler: Lightweight Recording to Reproduce Field Failures (Presented at I...
Chronicler: Lightweight Recording to Reproduce Field Failures (Presented at I...
 
A Large-Scale, Longitudinal Study of User Profiles in World of Warcraft
A Large-Scale, Longitudinal Study of User Profiles in World of WarcraftA Large-Scale, Longitudinal Study of User Profiles in World of Warcraft
A Large-Scale, Longitudinal Study of User Profiles in World of Warcraft
 

Recently uploaded

STERILITY TESTING OF PHARMACEUTICALS ppt by DR.C.P.PRINCE
STERILITY TESTING OF PHARMACEUTICALS ppt by DR.C.P.PRINCESTERILITY TESTING OF PHARMACEUTICALS ppt by DR.C.P.PRINCE
STERILITY TESTING OF PHARMACEUTICALS ppt by DR.C.P.PRINCEPRINCE C P
 
Recombinant DNA technology (Immunological screening)
Recombinant DNA technology (Immunological screening)Recombinant DNA technology (Immunological screening)
Recombinant DNA technology (Immunological screening)PraveenaKalaiselvan1
 
PossibleEoarcheanRecordsoftheGeomagneticFieldPreservedintheIsuaSupracrustalBe...
PossibleEoarcheanRecordsoftheGeomagneticFieldPreservedintheIsuaSupracrustalBe...PossibleEoarcheanRecordsoftheGeomagneticFieldPreservedintheIsuaSupracrustalBe...
PossibleEoarcheanRecordsoftheGeomagneticFieldPreservedintheIsuaSupracrustalBe...Sérgio Sacani
 
Lucknow 💋 Russian Call Girls Lucknow Finest Escorts Service 8923113531 Availa...
Lucknow 💋 Russian Call Girls Lucknow Finest Escorts Service 8923113531 Availa...Lucknow 💋 Russian Call Girls Lucknow Finest Escorts Service 8923113531 Availa...
Lucknow 💋 Russian Call Girls Lucknow Finest Escorts Service 8923113531 Availa...anilsa9823
 
Spermiogenesis or Spermateleosis or metamorphosis of spermatid
Spermiogenesis or Spermateleosis or metamorphosis of spermatidSpermiogenesis or Spermateleosis or metamorphosis of spermatid
Spermiogenesis or Spermateleosis or metamorphosis of spermatidSarthak Sekhar Mondal
 
Formation of low mass protostars and their circumstellar disks
Formation of low mass protostars and their circumstellar disksFormation of low mass protostars and their circumstellar disks
Formation of low mass protostars and their circumstellar disksSérgio Sacani
 
Work, Energy and Power for class 10 ICSE Physics
Work, Energy and Power for class 10 ICSE PhysicsWork, Energy and Power for class 10 ICSE Physics
Work, Energy and Power for class 10 ICSE Physicsvishikhakeshava1
 
Disentangling the origin of chemical differences using GHOST
Disentangling the origin of chemical differences using GHOSTDisentangling the origin of chemical differences using GHOST
Disentangling the origin of chemical differences using GHOSTSérgio Sacani
 
Hubble Asteroid Hunter III. Physical properties of newly found asteroids
Hubble Asteroid Hunter III. Physical properties of newly found asteroidsHubble Asteroid Hunter III. Physical properties of newly found asteroids
Hubble Asteroid Hunter III. Physical properties of newly found asteroidsSérgio Sacani
 
Biological Classification BioHack (3).pdf
Biological Classification BioHack (3).pdfBiological Classification BioHack (3).pdf
Biological Classification BioHack (3).pdfmuntazimhurra
 
Presentation Vikram Lander by Vedansh Gupta.pptx
Presentation Vikram Lander by Vedansh Gupta.pptxPresentation Vikram Lander by Vedansh Gupta.pptx
Presentation Vikram Lander by Vedansh Gupta.pptxgindu3009
 
Botany 4th semester file By Sumit Kumar yadav.pdf
Botany 4th semester file By Sumit Kumar yadav.pdfBotany 4th semester file By Sumit Kumar yadav.pdf
Botany 4th semester file By Sumit Kumar yadav.pdfSumit Kumar yadav
 
Traditional Agroforestry System in India- Shifting Cultivation, Taungya, Home...
Traditional Agroforestry System in India- Shifting Cultivation, Taungya, Home...Traditional Agroforestry System in India- Shifting Cultivation, Taungya, Home...
Traditional Agroforestry System in India- Shifting Cultivation, Taungya, Home...jana861314
 
Call Girls in Mayapuri Delhi 💯Call Us 🔝9953322196🔝 💯Escort.
Call Girls in Mayapuri Delhi 💯Call Us 🔝9953322196🔝 💯Escort.Call Girls in Mayapuri Delhi 💯Call Us 🔝9953322196🔝 💯Escort.
Call Girls in Mayapuri Delhi 💯Call Us 🔝9953322196🔝 💯Escort.aasikanpl
 
A relative description on Sonoporation.pdf
A relative description on Sonoporation.pdfA relative description on Sonoporation.pdf
A relative description on Sonoporation.pdfnehabiju2046
 
Bentham & Hooker's Classification. along with the merits and demerits of the ...
Bentham & Hooker's Classification. along with the merits and demerits of the ...Bentham & Hooker's Classification. along with the merits and demerits of the ...
Bentham & Hooker's Classification. along with the merits and demerits of the ...Nistarini College, Purulia (W.B) India
 
Discovery of an Accretion Streamer and a Slow Wide-angle Outflow around FUOri...
Discovery of an Accretion Streamer and a Slow Wide-angle Outflow around FUOri...Discovery of an Accretion Streamer and a Slow Wide-angle Outflow around FUOri...
Discovery of an Accretion Streamer and a Slow Wide-angle Outflow around FUOri...Sérgio Sacani
 
Grafana in space: Monitoring Japan's SLIM moon lander in real time
Grafana in space: Monitoring Japan's SLIM moon lander  in real timeGrafana in space: Monitoring Japan's SLIM moon lander  in real time
Grafana in space: Monitoring Japan's SLIM moon lander in real timeSatoshi NAKAHIRA
 
Physiochemical properties of nanomaterials and its nanotoxicity.pptx
Physiochemical properties of nanomaterials and its nanotoxicity.pptxPhysiochemical properties of nanomaterials and its nanotoxicity.pptx
Physiochemical properties of nanomaterials and its nanotoxicity.pptxAArockiyaNisha
 

Recently uploaded (20)

STERILITY TESTING OF PHARMACEUTICALS ppt by DR.C.P.PRINCE
STERILITY TESTING OF PHARMACEUTICALS ppt by DR.C.P.PRINCESTERILITY TESTING OF PHARMACEUTICALS ppt by DR.C.P.PRINCE
STERILITY TESTING OF PHARMACEUTICALS ppt by DR.C.P.PRINCE
 
Recombinant DNA technology (Immunological screening)
Recombinant DNA technology (Immunological screening)Recombinant DNA technology (Immunological screening)
Recombinant DNA technology (Immunological screening)
 
PossibleEoarcheanRecordsoftheGeomagneticFieldPreservedintheIsuaSupracrustalBe...
PossibleEoarcheanRecordsoftheGeomagneticFieldPreservedintheIsuaSupracrustalBe...PossibleEoarcheanRecordsoftheGeomagneticFieldPreservedintheIsuaSupracrustalBe...
PossibleEoarcheanRecordsoftheGeomagneticFieldPreservedintheIsuaSupracrustalBe...
 
Lucknow 💋 Russian Call Girls Lucknow Finest Escorts Service 8923113531 Availa...
Lucknow 💋 Russian Call Girls Lucknow Finest Escorts Service 8923113531 Availa...Lucknow 💋 Russian Call Girls Lucknow Finest Escorts Service 8923113531 Availa...
Lucknow 💋 Russian Call Girls Lucknow Finest Escorts Service 8923113531 Availa...
 
CELL -Structural and Functional unit of life.pdf
CELL -Structural and Functional unit of life.pdfCELL -Structural and Functional unit of life.pdf
CELL -Structural and Functional unit of life.pdf
 
Spermiogenesis or Spermateleosis or metamorphosis of spermatid
Spermiogenesis or Spermateleosis or metamorphosis of spermatidSpermiogenesis or Spermateleosis or metamorphosis of spermatid
Spermiogenesis or Spermateleosis or metamorphosis of spermatid
 
Formation of low mass protostars and their circumstellar disks
Formation of low mass protostars and their circumstellar disksFormation of low mass protostars and their circumstellar disks
Formation of low mass protostars and their circumstellar disks
 
Work, Energy and Power for class 10 ICSE Physics
Work, Energy and Power for class 10 ICSE PhysicsWork, Energy and Power for class 10 ICSE Physics
Work, Energy and Power for class 10 ICSE Physics
 
Disentangling the origin of chemical differences using GHOST
Disentangling the origin of chemical differences using GHOSTDisentangling the origin of chemical differences using GHOST
Disentangling the origin of chemical differences using GHOST
 
Hubble Asteroid Hunter III. Physical properties of newly found asteroids
Hubble Asteroid Hunter III. Physical properties of newly found asteroidsHubble Asteroid Hunter III. Physical properties of newly found asteroids
Hubble Asteroid Hunter III. Physical properties of newly found asteroids
 
Biological Classification BioHack (3).pdf
Biological Classification BioHack (3).pdfBiological Classification BioHack (3).pdf
Biological Classification BioHack (3).pdf
 
Presentation Vikram Lander by Vedansh Gupta.pptx
Presentation Vikram Lander by Vedansh Gupta.pptxPresentation Vikram Lander by Vedansh Gupta.pptx
Presentation Vikram Lander by Vedansh Gupta.pptx
 
Botany 4th semester file By Sumit Kumar yadav.pdf
Botany 4th semester file By Sumit Kumar yadav.pdfBotany 4th semester file By Sumit Kumar yadav.pdf
Botany 4th semester file By Sumit Kumar yadav.pdf
 
Traditional Agroforestry System in India- Shifting Cultivation, Taungya, Home...
Traditional Agroforestry System in India- Shifting Cultivation, Taungya, Home...Traditional Agroforestry System in India- Shifting Cultivation, Taungya, Home...
Traditional Agroforestry System in India- Shifting Cultivation, Taungya, Home...
 
Call Girls in Mayapuri Delhi 💯Call Us 🔝9953322196🔝 💯Escort.
Call Girls in Mayapuri Delhi 💯Call Us 🔝9953322196🔝 💯Escort.Call Girls in Mayapuri Delhi 💯Call Us 🔝9953322196🔝 💯Escort.
Call Girls in Mayapuri Delhi 💯Call Us 🔝9953322196🔝 💯Escort.
 
A relative description on Sonoporation.pdf
A relative description on Sonoporation.pdfA relative description on Sonoporation.pdf
A relative description on Sonoporation.pdf
 
Bentham & Hooker's Classification. along with the merits and demerits of the ...
Bentham & Hooker's Classification. along with the merits and demerits of the ...Bentham & Hooker's Classification. along with the merits and demerits of the ...
Bentham & Hooker's Classification. along with the merits and demerits of the ...
 
Discovery of an Accretion Streamer and a Slow Wide-angle Outflow around FUOri...
Discovery of an Accretion Streamer and a Slow Wide-angle Outflow around FUOri...Discovery of an Accretion Streamer and a Slow Wide-angle Outflow around FUOri...
Discovery of an Accretion Streamer and a Slow Wide-angle Outflow around FUOri...
 
Grafana in space: Monitoring Japan's SLIM moon lander in real time
Grafana in space: Monitoring Japan's SLIM moon lander  in real timeGrafana in space: Monitoring Japan's SLIM moon lander  in real time
Grafana in space: Monitoring Japan's SLIM moon lander in real time
 
Physiochemical properties of nanomaterials and its nanotoxicity.pptx
Physiochemical properties of nanomaterials and its nanotoxicity.pptxPhysiochemical properties of nanomaterials and its nanotoxicity.pptx
Physiochemical properties of nanomaterials and its nanotoxicity.pptx
 

A Large-Scale Study of Test Coverage Evolution

  • 1. ASE Sept 5, 2018 A Large-Scale Study of Test Coverage Evolution Michael Hilton, Jonathan Bell, and Darko Marinov Carnegie Mellon University, George Mason University, and University of Illinois at Urbana-Champaign http://www.code-coverage.org/
  • 2. ASE Sept 5, 2018 Coverage is the start to a conversation about test quality total # of statements executed by tests total # of statementsStatement Coverage =
  • 3. code-coverage.orgASE Sept 5, 2018 Coverage Uses • So how do the projects in the middle use coverage on a day-to-day basis, in a regression environment? • Try to increase coverage • Try to ensure each change is covered • Use coverage for regression test selection/flaky test detection • Our goal: Revisit what coverage can be used for, develop new metrics through an empirical study
  • 4. code-coverage.orgASE Sept 5, 2018 1a. Literature search 2a. Clone and build projects, collect coverage 29 projects 5,360 builds Identifying Projects Collecting Coverage 2b. Extract data from Coveralls API 1b. GitHub + Coveralls mining 18 projects 2,456 builds 3. Analyze diffs and coverage per-build 4. Visualize aggregate data 47 projects, 7,816 builds Synthesizing Results Generating Visualizations Methodology Our dataset of code coverage information from 7,816 revisions of 47 projects is publicly available: http://www.code-coverage.org/ + 2b. Extract data from Coveralls API 1b. GitHub + Coveralls mining 1a. Literature search 2a. Clone and build projects, collect coverage 3. Analyze diffs and coverage per-build 4. Visualize aggregate data 18 projects 29 projects 2,456 builds 5,360 builds 47 projects, 7,816 builds Identifying Projects Collecting Coverage Synthesizing Results Generating Visualizations Coveralls: A (previously) untapped new resource for researchers
  • 5. code-coverage.orgASE Sept 5, 2018 Tooling We used diff to compare across file versions to track the changes to unchanged but moved lines $ diff --unchanged-line-format="%dn,%c'12'" --new-line-format="n%c'12'" --old- line-format="" $FILE1 $FILE2 | awk '/,/{n++;print $0n} /n/{n++}'" 1. Foo; 2. Bar; 1. New; 2. Foo; 3. Bar; Source file, version 1 Source file, version 2
  • 6. code-coverage.orgASE Sept 5, 2018 New Questions • Which statements were covered but are no longer covered? • Which statements are newly covered? • Which statements flap between covered and uncovered? • Broadly: How does a change to one statement impact the coverage of other statements?
  • 7. code-coverage.orgASE Sept 5, 2018 RQ: Instead of trying to examine the total coverage, is it enough to monitor just the patch coverage?
  • 8. code-coverage.orgASE Sept 5, 2018 Patch coverage does not correlate with overall coverage P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 P11 P12 P13 P14 P15 P16 P17 P18 P19 P20 P21 P22 P23 P24 P25 P26 P27 P28 P29 P30 P31 P32 P33 P34 P35 P36 P37 P38 P39 P40 P41 P42 P43 P44 P45 P46 P47 0 (0−25) (25−50] (50−75] (75−100) 100 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 0% 25% 50% 75% 100% Percent of builds satisfying patch coverage % at level indicated by color: Percent of builds satisfying coverage % at level indicated by color: 0 (0−25) (25−50] (50−75] (75−100) 100 25% 50% 75% Percent of builds satisfying patch coverage % at level indicated by color: Implication for developers: Do not rely on patch coverage as an indicator of overall quality
  • 9. code-coverage.orgASE Sept 5, 2018 int x = 12; if(x > 10) { doStuff(); } RQ: What impact do patches have on the coverage of non-patch code? int x = 12; if(x > 10) { doStuff(); } Original version: all lines covered, doStuff() is called if(x > 10) { doStuff(); } int x = 10; New version: first line changed, reduces coverage since doStuff() not called
  • 10. code-coverage.orgASE Sept 5, 2018 Patches often impact coverage of existing (non-patch) code P01 P02 P03 P04 P05 P06 P07 P08 P09 P10 P11 P12 P13 P14 P15 P16 P17 P18 P19 P20 P21 P22 P23 P24 P25 P26 P27 P28 P29 P30 P31 P32 P33 P34 P35 P36 P37 P38 P39 P40 P41 P42 P43 P44 P45 P46 P47 0 25 50 75 100 Patches with changes to code files: Patches with no changes to code files: Increase Increase No impact No impact Decrease Decrease P01 P02 P03 P04 P05 P06 P07 P08 P09 P10 P11 P12 P13 P14 P15 P16 P17 P18 P19 P20 P21 P22 P23 P24 P25 P26 P27 P28 P29 P30 P31 P32 P33 P34 P35 P36 P37 P38 P39 P40 P41 P42 P43 P44 P45 P46 P47 0 25 50 75 100 Patches with changes to code files: Patches with no changes to code files: Increase Increase No impact No impact Decrease Decrease Implication for developers: Do not assume patches leave existing coverage unchanged Implication for researchers: Do not assume changes to non-code files do not change behavior
  • 11. code-coverage.orgASE Sept 5, 2018 Tracking Coverage Over Time Ideal progression of coverage Also possible progression of coverage 40% Covered Version 1 50% Covered Version 2 60% Covered Version 3 80% Covered Version 4 40% Covered 50% Covered 60% Covered 80% Covered Covered Not Covered New idea: what about tracking the coverage of each statement?
  • 12. code-coverage.orgASE Sept 5, 2018 RQ: Is it ever the case that coverage changes in ways we cannot observe using traditional code coverage metrics? 60% Coverage 60% Coverage ≠
  • 13. code-coverage.orgASE Sept 5, 2018 Percentage of commits (size of bar) with statements changing coverage (color of bar) even when the total project coverage did not appear to change. 25 50 75 0 1−10 11−100 101−1,000 1,001+ P01 P02 P03 P04 P05 P06 P07 P08 P09 P10 P11 P12 P13 P14 P15 P16 P17 P18 P19 P20 P21 P22 P23 P24 P25 P26 P27 P28 P29 P30 P31 P32 P33 P34 P35 P36 P37 P38 P39 P40 P41 P42 P43 P44 P45 P46 P47 0 25 50 75 100 0 1−10 11−100 101−1,000 1,001+ Set of lines covered each build can vary Implication for developers: Do not rely on “steady” coverage indicating no change to coverage
  • 14. code-coverage.orgASE Sept 5, 2018 RQ: How does the set of covered lines change? Are there hot-spots of coverage change, i.e., lines that flip between being covered and uncovered throughout evolution? int x = 12; int x = 12; int x = 12; int x = 12;
  • 15. code-coverage.orgASE Sept 5, 2018 Lines often flip coverage state ●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●● ●●●●●●●●●● ●●●●●● ●●● ● ●● ●●●●●●●●●●●●●●●●●●●●●● ●●●●● ●●●●● ●●●●● ● ●●●●● ●●● ●● ●●●● ●●●●●●●● ●● ●●●●● ●●●●●●● ●●●●●●●●●●●● ●●●●●●●●●●●●●●●●● ●●●●●●●● ●●●●● ●●●●●●● ●●● ● ●●● ● ●● ●● ●●● ●● ● ●● ● ●●●●●●● ●●● ●●●● ●● ●●●● ●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●● ● ●●●●●● ●●●●●●● ●●●●●●●●●●●●● ●●●●●● ●●●●●● ●●●●●●●●●●●●●●●●●● ●●●●●● ●●●●● ●●●● ●●● ●●● ●● ●●●● ●●●●● ●● ●● ●● ● ●● ●●●● ●●● ●● ●● ●● ● ●●● ●●●● ●●●●●● ●●●● ●●●● ●● ●●● ●● ● ●●●●● ●●●● ● ●● ● ●●●●● ●● ●● ●●●●●● ●● ●●●● ●●● ●● ●●●● ●●●● ●● ●●● ●● ●●● ● ●●● ●●●● ● ●● ●●● ●●●●●●●●●●● ● ●●●● ●● ●● ●● ●●●● ●● ●● ●●● ● ● ●● ●● ●●● ●●●● ●●●●● ●●● ●●●●● ●● ● ●●● ●● ●● ●● ●● ● ●●●● ● ●● ●● ●● ●● ●●●●●● ●● ●● ●● ●●●●● ●●● ●● ● ●● ●●● ●●●● ●●●● ●● ●●● ●● ●●● ●● ●●●● ●●●● ●●●● ●● ●●●● ●●● ●● ●● ●●● ●●●●● ●● ●●●● ●●● ●●● ●●● ●●●●●● ● ●● ●● ●●●●●● ●● ●●● ●●●● ●●● ●●● ●●●●●● ●●● ●●●● ●● ●●●● ●●●● ●●●● ●● ●●● ●●●●● ●●●●●●● ●● ●●● ●●● ● ●●●● ●● ●●● ●●● ●● ●●● ●● ●●●●● ●● ●●●●● ●● ●●● ●● ●● ●●● ●●● ●●● ● ●● ●● ● ●●● ●●● ●●● ●●●● ●● ●● ●●●●● ●●●●●● ●● ●●● ● ●●● ●●●●●● ●● ● ●●●● ● ●● ●●●● ●●●●●●● ●●●● ●●● ●● ●● ● ●●● ●● ●●●● ●●● ●●●● ●●●●● ●●● ●● ●● ●● ●●●● ● ● ●● ●● ●● ● ●● ●●●● ●● ●●● ●●●●● ●●●●● ●●● ●●●●●● ●●●●● ●●●●● ●●●●● ●● ●● ●●●● ●●● ●● ● ●●● ●● ● ● ●●●● ●● ●● ●●●● ●●● ●● ●●●● ●●●● ●●● ●●●●● ●● ● ●●●● ●● ●●● ●● ●● ●●● ● ●●●● ●●●● ●●● ●● ●● ●● ●●● ●●●●● ●●●● ●●● ●● ●● ●●●● ●●●● ●●●●● ●●● ●● ●●●● ●●● ●● ●●● ●● ●●● ●●●●●●● ●● ●●● ●●●●●● ●●●●● ●● ●●● ●● ●● ●● ●● ●● ●● ●●● ●● ●● ●●● ●●●● ●●●● ●● ●●● ●● ●●● ●● ●●● ●●●● ●● ●●● ●●● ●● ● ●●● ●●● ● ●●●● ●● ●● ●●●● ● ●●●●●●●●● ●● ●●● ●●●●● ●● ● ●●●● ●●● ●● ●●● ● ●● ●● ●●● ●●● ●●● ● ●● ●● ●● ●● ●●● ●●●● ●● ●●●● ●● ●●●● ●●● ●● ● ●●●● ●●●● ●● ● ●●●● ●●●●●● ●●● ●●● ●●●● ●●●●● ●●●●● ●●●● ●●●●● ●●●●●●●●●●●●●●●●●●● ●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●● ●●●●● ●●● ●●●●●●●●● ●●●●● ●● ●●●●●●●●●● ●●● ●●●●●●●●●● ● ●●●● ●● ●●●●●● ●●●●●●●●●● ●●●●●●●●●●●●●●●● ●●●● ●●●●●●● ●● ●●● ●●● ●●●●● ●●● ●●● ●●● ●●● ●● ●●●●●●●●●●● ●●●●●●●● ● ●●● ●●● ●●●● ●● ● ●● ●●● ● ●●●●●●●● ●●● ●● ●● ●●●●●● ●●● ●●●●●●●●●● ●●● ●●●●● ●● ●● ●●● ●●●●●●●●● ●●●●●●● ●●●●●●● ●●●●●●●●●●●●●●● ●●●● ●●● ●●●●●●● ●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●● ●●●●● ●●●●●●● ●●●●●●●●●●●●●● ●●●●●● ●●●●●● ●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●● ●●● ●●● ● ●● ●● ●● ●● ●●● ●●●●●●●●● ●●●●●● ● ●●● ●● ●● ●●●●● ●●●● ●● ●●●●●●●●●●● ●● ●●●●●●●●●●●●●●●●●●●●●●●● ●●●●● ●●●●●●●●● ●●● ●● ●●●● ●●●●●●●●● ●● ●●● ●● ● ●● ●● ●●● ●● ● ● ●● ●● ●● ●● ●●●●● ●●●●●●●●●●● ●●●●●●●●●●●●●●●●● ●●●●● ● ●●● ●●●● ●●● ●●●●● ●●●● ●●●●●●●●●●●●●●●●●●●● ●●● ●●●●●●●●●●●● ● ●●●●● ●●● ●●●●●● ●●●● ●●●●●●● ●● ●●●● ●●● ●●●●● ●●●●● ●● ●●●●● ●●●●● ●● ●● ●●●●● ●●●●● ●●●●●●●●●●●● ●●●●●●●●●●●● ●●● ●●●●● ●●●●● ●●●●●● ●●●● ● ●●● ●●●●●● ● ●● ●●●●●●● ● ●● ●● ● ●●● ● ●●●●● ●●● ●●● ●● ●● ●● ●● ●●●●● ●● ●●●● ●●●●● ●● ●●●●●●● ●●●●●●●●●●● ●●●●●●●● ●●●●●● ●● ●● ●● ●● ●●● ●●●●●●●● ●●●●● ●●●●●● ●● ●●● ●● ●●●● ●●● ●●●● ●●●●●● ● ●●●● ●● ●● ● ●●● ● ●●●●●● ●●●●●●●●●●●●●● ●● ●●● ●●●●●●●● ● ●● ●● ●●● ● ●●●● ●● ●●● ● ●● ●●●● ●● ●●●●●● ●● ●●● ●●●● ●●●●●●●●●●● ●●●●●●●●●● ●●●●●●●●●●●●●● ●●●●●● ●●●●● ● ●●●●●●●●●●●● ●● ●● ●●●● ●● ●● ●●●● ●●●● ●●●●● ●●●●●●●●●● ●●●●●●● ●●●● ●●●● ●●●●● ●●●●●●●● ● ●●●●●● ● ●●●●●●●● ●●●●●●●●●● ●● ●●● ●●●●●●●●●●●●●● ●● ●● ●● ● ●●● ●●● ● ●●●● ●●●● ●●●● ●●●● ●●●● ● ●●●●●● ●●●●●●●●●●●●● ●●●●●●●●●●●●● ●●● ●●●● ● ●●●● ●●●●● ●●● ●●●●● ●●● ●● ●●●● ●●●●●● ●●●● ●● ●● ●● ●●●●●●●●●●●●●● ●●●●●●●●●●●●●●● ●●● ●●●● ● ●●●●● ●●●● ●●●●● ●●●● ● ●●●●●●●●●●● ●●●●●●●● ●● ●●●●●●●●●●●●● ●● ●●●● ●● ●●● ●●● ●●●●●● ●● ●● ●●● ●●● ● ● ●●● ●●●●●●●● ●●●●●● ●●●●●●●●●●●●●●●●●●●●●● ●●● ●●●●●●●●●●●●●●●●●●● ●●●● ●●●● ●● ●●● ●●● ●● ●● ●● ●●●●●●●●●●●●●●●●●●● ●● ●●●●●● ●● ●●● ●●● ● ●●●●●●●●●●●●●●●●● ●●●● ● ●●●●● ●● ●● ●●● ●●●● ●●●●●● ●●●●● ●●●●●● ●●●●● ●●●● ● ●●●●●●● ●●●● ●●●● ●●●●●●●● ●●●●●●● ●●●●●● ●●●●●●●● ●●●●●● ●●●● ●●● ●●●●● ●●●●●●●● ●●●● ●●●●● ●●● ●●●●●●● ●●●●●●●●●● ● ● ●●●● ●●●● ●●● ●●●● ●●● ●●●●●●●●●●● ●●●●●●●●●●● ●●● ●●●●●●● ●●●● ●● ● ●● ●● ●● ●●●●●●●● ●●●●● ●●●●● ●●● ●●●●●●● ●●●●●●● ●●●●●●● ●●●●●●●●●●●●●●●● ●●● ●●●● ●●●●●●●●● ●● ●●●●●●●●●● ●●● ●●● ●●● ● ●●● ●●● ● ●●●● ●●●● ●●●● ●●●● ●●● ●●● ●●●● ●●● ●●●●●●● ●●●●●●●●● ●●●●●●●● ●● ●●●●●●●●●●●● ●●●●● ●● ●●●● ●●●● ●●●●● ●●●●●●●●●●●● ●● ●●●●● ●● ●●● ●●●●●● ●●● ●●●●●●●●● ●●●●●●●●●●●●●●●●●●● ●●●●●●●● ●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●● ●●●●● ● ●●●●●●● ●●●●●●●●●●● ●●●●●● ●●●●●● ●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●● ● ● ● ●●● ●● ● ●●●● ●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●● ●●● ●●●●●● ●● ●●●●●●●● ●●●●●● ●●● ●● ●●●● ●●● ●●●●●●●●● ●●● ●●● ●●●●●●● ● ●●●●●●●●● ●● ●●●● ●●●● ●● ●●●●●● ●● ●● ●●● ● ●●● ●● ●●●●●● ●●● ●●● ●●● ●●●●●● ●●● ●●●● ●● ●●● ●●● ● ●● ●●●● ●● ●●● ●● ●●● ●●● ● ●●●● ●● ●●● ●●● ●●●● ●●● ●● ●●● ●●●● ●●● ●●● ●●●● ●●●● ●●●●● ●●●● ●● ●● ●●● ●● ●● ●●●●●●● ●●●● ● ●●●●●●●● ●●●● ●●●●●● ●●●●●●● ●●●● ●●●●● ● ●● ●● ●●●● ●●●●●●●●● ●●●●● ●●●●●● ●●●●●●● ●●●● ●●●●●● ●●●●●●●●●●● ●●●● ●●●●● ●●● ●●●●● ●●● ●●●●●●●●●●●●●●●● ●●● ●●●●● ●● ●●●●●●●●●●●●●●●● ●●●●● ●●●●●● ●●●●●●●● ●● ●●● ● ●● ●● ●●●● ●●● ●●●●●●●●●●● ●●●● ● ●● ●●●● ●●●●●● ● ●● ●●● ●●● ●●●●●●● ●●●●● ● ●●● ●●● ●●●●●●●●●●●●●●● ● ●● ●●●●●●●●● ●●● ●●●●●● ●●●●● ●● ●● ●●● ●●●● ●●● ●●● ●●● ●●●● ●●● ●●●● ●● ●● ●●●● ●●●●●●● ●●●● ●●●● ●●●● ●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●● ●●●●●● ●●● ●●● ● ●●● ●●● ●● ●●● ●●●●●●●●● ●● ●●●●● ●● ●●●●● ●●● ●●●●●● ●● ●●●●● ●●●●● ●●● ●●●●● ●●● ●●●●● ●●●● ● ●●●●● ●●●● ●●● ●●●●●● ● ●● ●●● ●●●●●● ●●● ●●● ● ●●●●●●●●● ● ●●●● ●●● ●●●●●● ●●● ● ●●●● ●●● ●●● ●● ●● ●●●● ●●●●● ●● ● ●●●● ●● ●●● ● ●●●● ●●●●● ●●●●● ●● ●●●●●●● ●● ● ●●●● ●●●●●●●● ●● ●●●●● ●● ●●●●● ●● ●●● ●●●● ●● ● ●●●● ●● ●●● ●●●●● ●●● ●●●●●● ●●●● ●●●● ●●● ●● ●●●● ●●● ●● ●● ●● ●●● ●●●● ●● ●●● ●●●● ●●●●●●● ●●●●●●● ●●●●●● ●● ●●● ●●●●●●●●●●● ●● ●● ● ●● ●● ●● ●●● ●●●●● ●●●●●●● ●●●●●●● ●● ●●● ● ●●● ● ●● ●● ● ● ●● ●●●● ●●● ●●●●● ●●● ●●●●● ●●●● ●●●●● ●● ●●●●●● ●● ●●● ●●● ●●●●● ● ● ●●●● ●●●●● ●●●● ●● ●●● ●● ●●●●●●●●●●●●●●●●● ●● ●● ●●●●● ●●●●● ●● ●●●● ●●● ●● ●● ●● ●●● ●●●●● ●●●●●●●●●● ●●●●●●●●●●●●●●● ●●●●●●●● ●● ●●●● ● ●● ●●●● ●●● ●● ●●●●●●● ●●●● ●●●●●●●●●●● ●●●●●●●●●●●● ● ●● ●●●● ●●● ●● ●●●●●●●● ●●●●● ●●● ●● ●●●● ●● ● ●● ●● ●●●●●●●●●● ●● ● ●● ●●● ● ●●●●●●●●●● ●●●●●●●●● ●●● ●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●● ●●●●●●●●●●● ●●● ●● ●●●●●● ●●●● ● ●● ●●●● ●●● ●●● ●● ●●●●● ●● ●● ●●● ●●●●● ●●●●● ●●●●●●● ● ●●●●● ●●●●● ● ●● ●●● ●●● ●●●●● ●●●●●●● ●●● ●●●●● ●● ●●● ●●● ●●●● ●●●●●●● ●●●● ●● ● ● ●●●● ●● ●● ●●●● ●●●●● ●●● ● ●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●● ●●●●●●●●●●●●●●●● ●●●●●●●●●● ●●●●●●● ●●●●●●●●● ●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●● ●●●●●●●●●●●●●● ●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●● ●● ●● ●●●●● ●●● ●●●●●●●●● ●●●●●●●●●●● ●●●●●●●●●●●●●●●●● ●●●●●●●●●● ●●● ●●●● ●●●●●● ●●● ●● ● ●● ●●●●● ●● ●● ● ●●●● ●●●●● ●●● ●●● ● ●●●● ●●●● ● ●● ●●●● ●●● ● ●● ●●●● ●●● ●●●●●●●●●●● ●●● ● ●●● ●●●●●● ●●●●●● ●●● ●●●● ●●●● ●● ● ●●●●●●● ●● ● ●●●● ●●●●●● ●●● ●●●●●● ●●●● ●● ● ●● ●●●●● ●●●●● ● ● ●● ●●● ●●● ●● ●●●●●● ●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●● ●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ● ●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●● ●●● ●●●●●● ●●●●● ●●● ●● ●●●● ●●● ●●●●●●●●● ●●● ●●●●●● ●●●● ●● ●●●●●●●●●● ● ●● ● ●●●● ●● ●●●● ●●● ● ●●●●●● ●●● ●●●● ●●●●● ●● ●●● ●●● ●● ●●● ●●● ●● ●●●●●●●●●●●●●●●●●●●●●● ● ●● ●● ●●●● ●●●●●● ●● ●● ●●● ●● ●● ●● ●●● ●●● ●●●●●●●● ●●●● ●●●● ● ●●●●●●●●●● ●●● ●● ●●●●●● ●● ●●●● ●●●● ●● ●●●● ●●● ●●● ●● ●● ●●● ●●●●●● ●●●● ●●●●● ●● ●●●● ●● ●●●●●●●●● ●●● ● ●● ●● ●● ●●●●●● ●●●● ●●● ●●●●●●●●● ●●●●● ●●●●●●●●●●●●●●●●● ●●●●● ●●●● ● ●● ●● ● ●●●● ● ● ●●●● ●●●●●●● ●●●● ●●●●●●●● ●●●●●● ●●● ●●●●●●●●● ●● ● ●●●●● ●●●●●●●● ● ●● ●●● ●●●● ●●● ●● ●●● ●● ●●● ●●●● ●●●●● ●● ●●● ●●●● ●● ●●● ●●● ●● ● ●● ●●● ●●●●●●● ●●● ●●● ●● ●●● ●●● ●●●●●●● ●●●●●●●● ●●● ●● ●● ● ●● ●●●●● ●● ●●● ●●●●●●●● ●●●● ●● ●● ●● ●●● ●● ●●●●●●●●● ●● ●● ●●●● ●●●●●●●●●●● ●●● ●●●●●● ●●●● ●●●●●● ●●●●●●● ●● ●●●●●●● ● ●● ●● ●●●●●●● ●● ● ●●●●●●●● ●● ●● ●● ●●●● ●●● ●●● ● ●●●● ● ●●●● ●●●● ●●●● ●● ●●●● ●● ●● ●●● ● ●●● ●●●● ●●●●● ●●●●●● ●●● ●● ●●●● ●● ●●●●●● ●●●●● ●● ●● ●●●● ●● ●●●●● ●●●●●●●● ●● ●● ●●● ●● ●● ●●●●●●●● ●●●●● ●●● ●●● ● ●●● ●●●●●● ●●●●●● ●● ●●●●●●● ●● ● ●●● ●●●●●●●●● ●●●● ● ●●● ●●●●●●●●●● ●● ●●● ● ●●●●●●●●● ●●●● ●●●●●● ● ●●● ●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●● ●●●● ●● ●● ●●●●●●● ●●●●●●●● ●●● ● ●●● ●●●● ● ●●●● ●●●●●●●●●●● ●●●● ●●● ●●● ●●●●●● ●●●●● ●● ●●● ●●●● ●● ●●● ●●●● ●●● ● ●●●●●● ●● ●●●● ●●● ●● ●● ●●●● ●●●●● ●●●●● ●● ● ●●● ●●●●● ●●●●●● ●●● ●●●●●●●● ●● ●● ●●●● ●●●● ●●●●● ●● ●●● ●● ●●● ●●● ●●●●●● ●●●●●● ●● ●● ●● ●●●●●●●●●● ●● ●●●● ● ●●●●●●● ●● ●● ●●● ●● ●● ●●●●●●● ●●●● ●●●●● ●●● ●●●●●● ● ● ●●●● ●●● ●●● ●●●●● ●● ●●● ● ●●●● ●● ● ●●● ●●●●●● ●●●●●● ●●●●●● ● ●●● ●●●●●● ●● ●●● ●●●● ●●●●●●● ●●●●●●●● ●●●● ●● ●●● ●●●●●● ●●●● ●● ●● ●●●● ●● ●●●● ●● ●●●●●●●●●●●●●●●● ●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●● ●●●●●●● ●● ●●●●●●● ●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●● ●●●●● ●●●●●● ●● ●●● ●●●●●●●●●●● ●●●●●●●●●●●● ●●● ● ●● ● ●●● ●●●●●●● ●● ●●● ●●● ●●●●●●●●●●●●●●●●● ●●●●●●●●●●● ●●●●● ●●●● ●●●● ●●●● ● ●●●●●● ●● ●●●●● ●●●● ●●●●●●●●●●● ●●● ● ●●●● ●●●●●● ●●●● ●● ●●●●●● ●●● ●● ●●● ●●●●●● ● ●●● ●●● ●●●● ●● ●● ●●● ●●● ●● ●● ●● ●● ●●● ●● ● ●● ●●● ●●● ●● ●●● ●●● ● ●●● ● ●●● ●●●●● ●●● ●● ●●●●●●●●●●●● ●● ●●● ●●● ●● ●● ●●●● ●●●●●● ●●●●●●●● ●●●● ●● ●● ●●●●●● ● ● ●● ●●● ●●●●● ● ●●●● ●●●● ●● ●●● ●●●●●● ● ●●●●●●●●●●●● ●●● ●●● ●● ●●● ●●● ●● ●● ●●● ●● ● ●● ●●●●●● ●●● ● ●● ●● ●● ●●●● ●●● ● ● ●● ●● ●●● ●● ● ●●●● ●● ●● ● ●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●● ●●● ●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●● ●●● ●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●● ●●●●●●●●●●●●●●●●●●●●●●● ●●● ●● ●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●● ●●●●●●●●●● ●●●●●● ●●● ● ●● ●●●●●●●●●●●●●●●●●●●●●● ●●●●● ●●●●● ●●●●● ● ●●●●● ●●● ●● ●●●● ●●●●●●●● ●● ●●●●● ●●●●●●● ●●●●●●●●●●●● ●●●●●●●●●●●●●●●●● ●●●●●●●● ●●●●● ●●●●●●● ●●● ● ●●● ● ●● ●● ●●● ●● ● ●● ● ●●●●●●● ●●● ●●●● ●● ●●●● ●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●● ● ●●●●●● ●●●●●●● ●●●●●●●●●●●●● ●●●●●● ●●●●●● ●●●●●●●●●●●●●●●●●● ●●●●●● ●●●●● ●●●● ●●● ●●● ●● ●●●● ●●●●● ●● ●● ●● ● ●● ●●●● ●●● ●● ●● ●● ● ●●● ●●●● ●●●●●● ●●●● ●●●● ●● ●●● ●● ● ●●●●● ●●●● ● ●● ● ●●●●● ●● ●● ●●●●●● ●● ●●●● ●●● ●● ●●●● ●●●● ●● ●●● ●● ●●● ● ●●● ●●●● ● ●● ●●● ●●●●●●●●●●● ● ●●●● ●● ●● ●● ●●●● ●● ●● ●●● ● ● ●● ●● ●●● ●●●● ●●●●● ●●● ●●●●● ●● ● ●●● ●● ●● ●● ●● ● ●●●● ● ●● ●● ●● ●● ●●●●●● ●● ●● ●● ●●●●● ●●● ●● ● ●● ●●● ●●●● ●●●● ●● ●●● ●● ●●● ●● ●●●● ●●●● ●●●● ●● ●●●● ●●● ●● ●● ●●● ●●●●● ●● ●●●● ●●● ●●● ●●● ●●●●●● ● ●● ●● ●●●●●● ●● ●●● ●●●● ●●● ●●● ●●●●●● ●●● ●●●● ●● ●●●● ●●●● ●●●● ●● ●●● ●●●●● ●●●●●●● ●● ●●● ●●● ● ●●●● ●● ●●● ●●● ●● ●●● ●● ●●●●● ●● ●●●●● ●● ●●● ●● ●● ●●● ●●● ●●● ● ●● ●● ● ●●● ●●● ●●● ●●●● ●● ●● ●●●●● ●●●●●● ●● ●●● ● ●●● ●●●●●● ●● ● ●●●● ● ●● ●●●● ●●●●●●● ●●●● ●●● ●● ●● ● ●●● ●● ●●●● ●●● ●●●● ●●●●● ●●● ●● ●● ●● ●●●● ● ● ●● ●● ●● ● ●● ●●●● ●● ●●● ●●●●● ●●●●● ●●● ●●●●●● ●●●●● ●●●●● ●●●●● ●● ●● ●●●● ●●● ●● ● ●●● ●● ● ● ●●●● ●● ●● ●●●● ●●● ●● ●●●● ●●●● ●●● ●●●●● ●● ● ●●●● ●● ●●● ●● ●● ●●● ● ●●●● ●●●● ●●● ●● ●● ●● ●●● ●●●●● ●●●● ●●● ●● ●● ●●●● ●●●● ●●●●● ●●● ●● ●●●● ●●● ●● ●●● ●● ●●● ●●●●●●● ●● ●●● ●●●●●● ●●●●● ●● ●●● ●● ●● ●● ●● ●● ●● ●●● ●● ●● ●●● ●●●● ●●●● ●● ●●● ●● ●●● ●● ●●● ●●●● ●● ●●● ●●● ●● ● ●●● ●●● ● ●●●● ●● ●● ●●●● ● ●●●●●●●●● ●● ●●● ●●●●● ●● ● ●●●● ●●● ●● ●●● ● ●● ●● ●●● ●●● ●●● ● ●● ●● ●● ●● ●●● ●●●● ●● ●●●● ●● ●●●● ●●● ●● ● ●●●● ●●●● ●● ● ●●●● ●●●●●● ●●● ●●● ●●●● ●●●●● ●●●●● ●●●● ●●●●● ●●●●●●●●●●●●●●●●●●● ●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●● ●●●●● ●●● ●●●●●●●●● ●●●●● ●● ●●●●●●●●●● ●●● ●●●●●●●●●● ● ●●●● ●● ●●●●●● ●●●●●●●●●● ●●●●●●●●●●●●●●●● ●●●● ●●●●●●● ●● ●●● ●●● ●●●●● ●●● ●●● ●●● ●●● ●● ●●●●●●●●●●● ●●●●●●●● ● ●●● ●●● ●●●● ●● ● ●● ●●● ● ●●●●●●●● ●●● ●● ●● ●●●●●● ●●● ●●●●●●●●●● ●●● ●●●●● ●● ●● ●●● ●●●●●●●●● ●●●●●●● ●●●●●●● ●●●●●●●●●●●●●●● ●●●● ●●● ●●●●●●● ●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●● ●●●●● ●●●●●●● ●●●●●●●●●●●●●● ●●●●●● ●●●●●● ●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●● ●●● ●●● ● ●● ●● ●● ●● ●●● ●●●●●●●●● ●●●●●● ● ●●● ●● ●● ●●●●● ●●●● ●● ●●●●●●●●●●● ●● ●●●●●●●●●●●●●●●●●●●●●●●● ●●●●● ●●●●●●●●● ●●● ●● ●●●● ●●●●●●●●● ●● ●●● ●● ● ●● ●● ●●● ●● ● ● ●● ●● ●● ●● ●●●●● ●●●●●●●●●●● ●●●●●●●●●●●●●●●●● ●●●●● ● ●●● ●●●● ●●● ●●●●● ●●●● ●●●●●●●●●●●●●●●●●●●● ●●● ●●●●●●●●●●●● ● ●●●●● ●●● ●●●●●● ●●●● ●●●●●●● ●● ●●●● ●●● ●●●●● ●●●●● ●● ●●●●● ●●●●● ●● ●● ●●●●● ●●●●● ●●●●●●●●●●●● ●●●●●●●●●●●● ●●● ●●●●● ●●●●● ●●●●●● ●●●● ● ●●● ●●●●●● ● ●● ●●●●●●● ● ●● ●● ● ●●● ● ●●●●● ●●● ●●● ●● ●● ●● ●● ●●●●● ●● ●●●● ●●●●● ●● ●●●●●●● ●●●●●●●●●●● ●●●●●●●● ●●●●●● ●● ●● ●● ●● ●●● ●●●●●●●● ●●●●● ●●●●●● ●● ●●● ●● ●●●● ●●● ●●●● ●●●●●● ● ●●●● ●● ●● ● ●●● ● ●●●●●● ●●●●●●●●●●●●●● ●● ●●● ●●●●●●●● ● ●● ●● ●●● ● ●●●● ●● ●●● ● ●● ●●●● ●● ●●●●●● ●● ●●● ●●●● ●●●●●●●●●●● ●●●●●●●●●● ●●●●●●●●●●●●●● ●●●●●● ●●●●● ● ●●●●●●●●●●●● ●● ●● ●●●● ●● ●● ●●●● ●●●● ●●●●● ●●●●●●●●●● ●●●●●●● ●●●● ●●●● ●●●●● ●●●●●●●● ● ●●●●●● ● ●●●●●●●● ●●●●●●●●●● ●● ●●● ●●●●●●●●●●●●●● ●● ●● ●● ● ●●● ●●● ● ●●●● ●●●● ●●●● ●●●● ●●●● ● ●●●●●● ●●●●●●●●●●●●● ●●●●●●●●●●●●● ●●● ●●●● ● ●●●● ●●●●● ●●● ●●●●● ●●● ●● ●●●● ●●●●●● ●●●● ●● ●● ●● ●●●●●●●●●●●●●● ●●●●●●●●●●●●●●● ●●● ●●●● ● ●●●●● ●●●● ●●●●● ●●●● ● ●●●●●●●●●●● ●●●●●●●● ●● ●●●●●●●●●●●●● ●● ●●●● ●● ●●● ●●● ●●●●●● ●● ●● ●●● ●●● ● ● ●●● ●●●●●●●● ●●●●●● ●●●●●●●●●●●●●●●●●●●●●● ●●● ●●●●●●●●●●●●●●●●●●● ●●●● ●●●● ●● ●●● ●●● ●● ●● ●● ●●●●●●●●●●●●●●●●●●● ●● ●●●●●● ●● ●●● ●●● ● ●●●●●●●●●●●●●●●●● ●●●● ● ●●●●● ●● ●● ●●● ●●●● ●●●●●● ●●●●● ●●●●●● ●●●●● ●●●● ● ●●●●●●● ●●●● ●●●● ●●●●●●●● ●●●●●●● ●●●●●● ●●●●●●●● ●●●●●● ●●●● ●●● ●●●●● ●●●●●●●● ●●●● ●●●●● ●●● ●●●●●●● ●●●●●●●●●● ● ● ●●●● ●●●● ●●● ●●●● ●●● ●●●●●●●●●●● ●●●●●●●●●●● ●●● ●●●●●●● ●●●● ●● ● ●● ●● ●● ●●●●●●●● ●●●●● ●●●●● ●●● ●●●●●●● ●●●●●●● ●●●●●●● ●●●●●●●●●●●●●●●● ●●● ●●●● ●●●●●●●●● ●● ●●●●●●●●●● ●●● ●●● ●●● ● ●●● ●●● ● ●●●● ●●●● ●●●● ●●●● ●●● ●●● ●●●● ●●● ●●●●●●● ●●●●●●●●● ●●●●●●●● ●● ●●●●●●●●●●●● ●●●●● ●● ●●●● ●●●● ●●●●● ●●●●●●●●●●●● ●● ●●●●● ●● ●●● ●●●●●● ●●● ●●●●●●●●● ●●●●●●●●●●●●●●●●●●● ●●●●●●●● ●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●● ●●●●● ● ●●●●●●● ●●●●●●●●●●● ●●●●●● ●●●●●● ●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●● ● ● ● ●●● ●● ● ●●●● ●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●● ●●● ●●●●●● ●● ●●●●●●●● ●●●●●● ●●● ●● ●●●● ●●● ●●●●●●●●● ●●● ●●● ●●●●●●● ● ●●●●●●●●● ●● ●●●● ●●●● ●● ●●●●●● ●● ●● ●●● ● ●●● ●● ●●●●●● ●●● ●●● ●●● ●●●●●● ●●● ●●●● ●● ●●● ●●● ● ●● ●●●● ●● ●●● ●● ●●● ●●● ● ●●●● ●● ●●● ●●● ●●●● ●●● ●● ●●● ●●●● ●●● ●●● ●●●● ●●●● ●●●●● ●●●● ●● ●● ●●● ●● ●● ●●●●●●● ●●●● ● ●●●●●●●● ●●●● ●●●●●● ●●●●●●● ●●●● ●●●●● ● ●● ●● ●●●● ●●●●●●●●● ●●●●● ●●●●●● ●●●●●●● ●●●● ●●●●●● ●●●●●●●●●●● ●●●● ●●●●● ●●● ●●●●● ●●● ●●●●●●●●●●●●●●●● ●●● ●●●●● ●● ●●●●●●●●●●●●●●●● ●●●●● ●●●●●● ●●●●●●●● ●● ●●● ● ●● ●● ●●●● ●●● ●●●●●●●●●●● ●●●● ● ●● ●●●● ●●●●●● ● ●● ●●● ●●● ●●●●●●● ●●●●● ● ●●● ●●● ●●●●●●●●●●●●●●● ● ●● ●●●●●●●●● ●●● ●●●●●● ●●●●● ●● ●● ●●● ●●●● ●●● ●●● ●●● ●●●● ●●● ●●●● ●● ●● ●●●● ●●●●●●● ●●●● ●●●● ●●●● ●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●● ●●●●●● ●●● ●●● ● ●●● ●●● ●● ●●● ●●●●●●●●● ●● ●●●●● ●● ●●●●● ●●● ●●●●●● ●● ●●●●● ●●●●● ●●● ●●●●● ●●● ●●●●● ●●●● ● ●●●●● ●●●● ●●● ●●●●●● ● ●● ●●● ●●●●●● ●●● ●●● ● ●●●●●●●●● ● ●●●● ●●● ●●●●●● ●●● ● ●●●● ●●● ●●● ●● ●● ●●●● ●●●●● ●● ● ●●●● ●● ●●● ● ●●●● ●●●●● ●●●●● ●● ●●●●●●● ●● ● ●●●● ●●●●●●●● ●● ●●●●● ●● ●●●●● ●● ●●● ●●●● ●● ● ●●●● ●● ●●● ●●●●● ●●● ●●●●●● ●●●● ●●●● ●●● ●● ●●●● ●●● ●● ●● ●● ●●● ●●●● ●● ●●● ●●●● ●●●●●●● ●●●●●●● ●●●●●● ●● ●●● ●●●●●●●●●●● ●● ●● ● ●● ●● ●● ●●● ●●●●● ●●●●●●● ●●●●●●● ●● ●●● ● ●●● ● ●● ●● ● ● ●● ●●●● ●●● ●●●●● ●●● ●●●●● ●●●● ●●●●● ●● ●●●●●● ●● ●●● ●●● ●●●●● ● ● ●●●● ●●●●● ●●●● ●● ●●● ●● ●●●●●●●●●●●●●●●●● ●● ●● ●●●●● ●●●●● ●● ●●●● ●●● ●● ●● ●● ●●● ●●●●● ●●●●●●●●●● ●●●●●●●●●●●●●●● ●●●●●●●● ●● ●●●● ● ●● ●●●● ●●● ●● ●●●●●●● ●●●● ●●●●●●●●●●● ●●●●●●●●●●●● ● ●● ●●●● ●●● ●● ●●●●●●●● ●●●●● ●●● ●● ●●●● ●● ● ●● ●● ●●●●●●●●●● ●● ● ●● ●●● ● ●●●●●●●●●● ●●●●●●●●● ●●● ●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●● ●●●●●●●●●●● ●●● ●● ●●●●●● ●●●● ● ●● ●●●● ●●● ●●● ●● ●●●●● ●● ●● ●●● ●●●●● ●●●●● ●●●●●●● ● ●●●●● ●●●●● ● ●● ●●● ●●● ●●●●● ●●●●●●● ●●● ●●●●● ●● ●●● ●●● ●●●● ●●●●●●● ●●●● ●● ● ● ●●●● ●● ●● ●●●● ●●●●● ●●● ● ●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●● ●●●●●●●●●●●●●●●● ●●●●●●●●●● ●●●●●●● ●●●●●●●●● ●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●● ●●●●●●●●●●●●●● ●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●● ●● ●● ●●●●● ●●● ●●●●●●●●● ●●●●●●●●●●● ●●●●●●●●●●●●●●●●● ●●●●●●●●●● ●●● ●●●● ●●●●●● ●●● ●● ● ●● ●●●●● ●● ●● ● ●●●● ●●●●● ●●● ●●● ● ●●●● ●●●● ● ●● ●●●● ●●● ● ●● ●●●● ●●● ●●●●●●●●●●● ●●● ● ●●● ●●●●●● ●●●●●● ●●● ●●●● ●●●● ●● ● ●●●●●●● ●● ● ●●●● ●●●●●● ●●● ●●●●●● ●●●● ●● ● ●● ●●●●● ●●●●● ● ● ●● ●●● ●●● ●● ●●●●●● ●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●● ●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ● ●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●● ●●● ●●●●●● ●●●●● ●●● ●● ●●●● ●●● ●●●●●●●●● ●●● ●●●●●● ●●●● ●● ●●●●●●●●●● ● ●● ● ●●●● ●● ●●●● ●●● ● ●●●●●● ●●● ●●●● ●●●●● ●● ●●● ●●● ●● ●●● ●●● ●● ●●●●●●●●●●●●●●●●●●●●●● ● ●● ●● ●●●● ●●●●●● ●● ●● ●●● ●● ●● ●● ●●● ●●● ●●●●●●●● ●●●● ●●●● ● ●●●●●●●●●● ●●● ●● ●●●●●● ●● ●●●● ●●●● ●● ●●●● ●●● ●●● ●● ●● ●●● ●●●●●● ●●●● ●●●●● ●● ●●●● ●● ●●●●●●●●● ●●● ● ●● ●● ●● ●●●●●● ●●●● ●●● ●●●●●●●●● ●●●●● ●●●●●●●●●●●●●●●●● ●●●●● ●●●● ● ●● ●● ● ●●●● ● ● ●●●● ●●●●●●● ●●●● ●●●●●●●● ●●●●●● ●●● ●●●●●●●●● ●● ● ●●●●● ●●●●●●●● ● ●● ●●● ●●●● ●●● ●● ●●● ●● ●●● ●●●● ●●●●● ●● ●●● ●●●● ●● ●●● ●●● ●● ● ●● ●●● ●●●●●●● ●●● ●●● ●● ●●● ●●● ●●●●●●● ●●●●●●●● ●●● ●● ●● ● ●● ●●●●● ●● ●●● ●●●●●●●● ●●●● ●● ●● ●● ●●● ●● ●●●●●●●●● ●● ●● ●●●● ●●●●●●●●●●● ●●● ●●●●●● ●●●● ●●●●●● ●●●●●●● ●● ●●●●●●● ● ●● ●● ●●●●●●● ●● ● ●●●●●●●● ●● ●● ●● ●●●● ●●● ●●● ● ●●●● ● ●●●● ●●●● ●●●● ●● ●●●● ●● ●● ●●● ● ●●● ●●●● ●●●●● ●●●●●● ●●● ●● ●●●● ●● ●●●●●● ●●●●● ●● ●● ●●●● ●● ●●●●● ●●●●●●●● ●● ●● ●●● ●● ●● ●●●●●●●● ●●●●● ●●● ●●● ● ●●● ●●●●●● ●●●●●● ●● ●●●●●●● ●● ● ●●● ●●●●●●●●● ●●●● ● ●●● ●●●●●●●●●● ●● ●●● ● ●●●●●●●●● ●●●● ●●●●●● ● ●●● ●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●● ●●●● ●● ●● ●●●●●●● ●●●●●●●● ●●● ● ●●● ●●●● ● ●●●● ●●●●●●●●●●● ●●●● ●●● ●●● ●●●●●● ●●●●● ●● ●●● ●●●● ●● ●●● ●●●● ●●● ● ●●●●●● ●● ●●●● ●●● ●● ●● ●●●● ●●●●● ●●●●● ●● ● ●●● ●●●●● ●●●●●● ●●● ●●●●●●●● ●● ●● ●●●● ●●●● ●●●●● ●● ●●● ●● ●●● ●●● ●●●●●● ●●●●●● ●● ●● ●● ●●●●●●●●●● ●● ●●●● ● ●●●●●●● ●● ●● ●●● ●● ●● ●●●●●●● ●●●● ●●●●● ●●● ●●●●●● ● ● ●●●● ●●● ●●● ●●●●● ●● ●●● ● ●●●● ●● ● ●●● ●●●●●● ●●●●●● ●●●●●● ● ●●● ●●●●●● ●● ●●● ●●●● ●●●●●●● ●●●●●●●● ●●●● ●● ●●● ●●●●●● ●●●● ●● ●● ●●●● ●● ●●●● ●● ●●●●●●●●●●●●●●●● ●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●● ●●●●●●● ●● ●●●●●●● ●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●● ●●●●● ●●●●●● ●● ●●● ●●●●●●●●●●● ●●●●●●●●●●●● ●●● ● ●● ● ●●● ●●●●●●● ●● ●●● ●●● ●●●●●●●●●●●●●●●●● ●●●●●●●●●●● ●●●●● ●●●● ●●●● ●●●● ● ●●●●●● ●● ●●●●● ●●●● ●●●●●●●●●●● ●●● ● ●●●● ●●●●●● ●●●● ●● ●●●●●● ●●● ●● ●●● ●●●●●● ● ●●● ●●● ●●●● ●● ●● ●●● ●●● ●● ●● ●● ●● ●●● ●● ● ●● ●●● ●●● ●● ●●● ●●● ● ●●● ● ●●● ●●●●● ●●● ●● ●●●●●●●●●●●● ●● ●●● ●●● ●● ●● ●●●● ●●●●●● ●●●●●●●● ●●●● ●● ●● ●●●●●● ● ● ●● ●●● ●●●●● ● ●●●● ●●●● ●● ●●● ●●●●●● ● ●●●●●●●●●●●● ●●● ●●● ●● ●●● ●●● ●● ●● ●●● ●● ● ●● ●●●●●● ●●● ● ●● ●● ●● ●●●● ●●● ● ● ●● ●● ●●● ●● ● ●●●● ●● ●● ● ●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●● ●●● ●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●● ●●● ●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●● ●●●●●●●●●●●●●●●●●●●●●●● ●●● ●● ●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●● P01 P02 P03 P04 P05 P06 P07 P08 P09 P10 P11 P12 P13 P14 P15 P17 P18 P19 P20 P21 P22 P24 P25 P26 P27 P28 P29 P30 P31 P32 P33 P34 P35 P36 P38 P39 P40 P41 P42 P43 P44 P45 P46 P47 25 50 75 100 125 Implication for all: Coverage can be non-deterministic (flaky). Tools and methods for using coverage must consider this
  • 16. code-coverage.orgASE Sept 5, 2018 RQ: What are the reasons for coverage changes? Does code coverage change because old code becomes tested, or because new, tested code is added? Or, does deleting lines drive changes to code coverage?