Last finishers
Joining, by = c("start_date", "n")
| Starting date |
Amount of finishers |
| 2022-03-17 |
1 |
| 2022-03-09 |
1 |
| 2022-03-06 |
1 |
| 2022-03-02 |
1 |
| 2022-02-24 |
1 |
| 2022-02-23 |
1 |
| 2022-02-19 |
1 |
| 2022-02-06 |
1 |
| 2022-02-02 |
2 |
| 2022-01-25 |
2 |
| 2022-01-23 |
1 |
| 2022-01-22 |
22 |
| 2022-01-20 |
1 |
| 2022-01-19 |
1 |
| 2022-01-15 |
1 |
| 2022-01-14 |
2 |
| 2021-12-27 |
1 |
| 2021-12-26 |
1 |
| 2021-12-22 |
1 |
| 2021-12-20 |
2 |
| 2021-12-19 |
1 |
| 2021-12-16 |
1 |
| 2021-12-13 |
1 |
| 2021-12-12 |
1 |
| 2021-12-10 |
1 |
| 2021-12-09 |
1 |
| 2021-12-05 |
1 |
| 2021-12-02 |
1 |
| 2021-11-29 |
1 |
| 2021-11-27 |
1 |
| 2021-11-25 |
1 |
| 2021-11-19 |
1 |
| 2021-11-14 |
2 |
| 2021-11-10 |
1 |
| 2021-10-27 |
1 |
| 2021-10-24 |
1 |
| 2021-10-21 |
1 |
| 2021-10-16 |
2 |
| 2021-10-08 |
1 |
| 2021-10-06 |
1 |
| 2021-10-05 |
2 |
| 2021-09-27 |
1 |
| 2021-09-11 |
1 |
| 2021-08-24 |
2 |
| 2021-08-23 |
2 |
| 2021-08-22 |
2 |
| 2021-08-20 |
1 |
| 2021-08-19 |
3 |
| 2021-08-18 |
2 |
| 2021-08-16 |
1 |
| 2021-08-15 |
3 |
| 2021-08-14 |
1 |
| 2021-08-13 |
2 |
| 2021-08-12 |
2 |
| 2021-08-11 |
3 |
| 2021-08-10 |
3 |
| 2021-08-09 |
1 |
| 2021-08-08 |
4 |
| 2021-08-07 |
5 |
| 2021-08-06 |
2 |
| 2021-08-05 |
2 |
| 2021-08-04 |
1 |
| 2021-08-03 |
1 |
| 2021-08-02 |
4 |
| 2021-08-01 |
2 |
| 2021-07-31 |
6 |
| 2021-07-30 |
6 |
| 2021-07-29 |
6 |
| 2021-07-28 |
7 |
| 2021-07-27 |
32 |
| 2021-07-26 |
1 |
| 2021-07-24 |
1 |
| 2021-07-21 |
18 |
| 2021-07-16 |
1 |
| 2021-07-15 |
1 |
| 2021-07-11 |
1 |
| 2021-07-01 |
1 |
| 2021-06-28 |
2 |
| 2021-06-25 |
1 |
| 2021-06-23 |
1 |
| 2021-06-22 |
1 |
| 2021-06-20 |
1 |
| 2021-06-18 |
2 |
| 2021-06-16 |
5 |
| 2021-06-15 |
4 |
| 2021-06-14 |
2 |
| 2021-06-13 |
1 |
| 2021-06-12 |
2 |
| 2021-06-09 |
4 |
| 2021-06-08 |
1 |
| 2021-06-07 |
3 |
| 2021-06-06 |
6 |
| 2021-06-04 |
3 |
| 2021-06-03 |
10 |
| 2021-05-14 |
1 |
| Total |
251 |
Amount of unique users
There was 1325 unique users since 2021-06-22 (when
design of data collection was changed).

Plot below shows, how many times people changed their clue settings.
Percentage on top of each column shows % of people with same length of
progress.

How far people usually go?
In the current design of data collection, many users are counted as
few users, not just one. For example, instead of 1 user who learned 20
letters, we might have 3 users – one learned only 3 letters, second
learned 12 and third — 5.
So we can’t really tell, how far in progress people usually go.
Instead, let’s take a look at distribution of learned letters we have in
our dataset.

Most users dropped it right away. This is to be expected. Many people
may stumble upon the site - or read about it and start the game but not
realise what its all about. Some may start and restart on a different
device which will get recognised as a new session. Remember we don’t use
usernames/logins.
Here is the table, which shows amount of learned letters for each
user:
| Starting letter |
Last letter |
Amount of letters |
| 0 |
25 |
25 |
| 0 |
25 |
25 |
| 0 |
25 |
25 |
| 0 |
25 |
25 |
| 0 |
25 |
25 |
| 0 |
25 |
25 |
| 0 |
25 |
25 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
24 |
24 |
| 0 |
23 |
23 |
| 0 |
23 |
23 |
| 0 |
23 |
23 |
| 0 |
23 |
23 |
| 0 |
23 |
23 |
| 0 |
23 |
23 |
| 0 |
23 |
23 |
| 0 |
23 |
23 |
| 0 |
23 |
23 |
| 0 |
24 |
23 |
| 1 |
24 |
23 |
| 0 |
23 |
23 |
| 0 |
23 |
23 |
| 0 |
24 |
23 |
| 0 |
23 |
23 |
| 0 |
23 |
23 |
| 0 |
24 |
23 |
| 0 |
23 |
23 |
| 1 |
24 |
23 |
| 0 |
23 |
23 |
| 0 |
24 |
23 |
| 0 |
23 |
23 |
| 0 |
24 |
23 |
| 0 |
23 |
23 |
| 0 |
23 |
23 |
| 0 |
23 |
23 |
| 0 |
24 |
23 |
| 0 |
23 |
23 |
| 0 |
23 |
23 |
| 0 |
23 |
23 |
| 0 |
23 |
23 |
| 1 |
24 |
23 |
| 0 |
23 |
23 |
| 0 |
24 |
23 |
| 0 |
23 |
23 |
| 0 |
24 |
23 |
| 1 |
24 |
23 |
| 0 |
23 |
23 |
| 1 |
24 |
22 |
| 0 |
22 |
22 |
| 1 |
24 |
22 |
| 0 |
23 |
22 |
| 0 |
22 |
22 |
| 0 |
22 |
22 |
| 1 |
24 |
22 |
| 1 |
24 |
22 |
| 1 |
23 |
22 |
| 2 |
24 |
22 |
| 0 |
22 |
22 |
| 0 |
22 |
22 |
| 0 |
22 |
22 |
| 1 |
24 |
22 |
| 2 |
24 |
22 |
| 0 |
22 |
22 |
| 2 |
25 |
22 |
| 0 |
21 |
21 |
| 0 |
21 |
21 |
| 0 |
21 |
21 |
| 2 |
24 |
21 |
| 4 |
25 |
21 |
| 0 |
21 |
21 |
| 2 |
24 |
21 |
| 2 |
24 |
21 |
| 0 |
21 |
21 |
| 0 |
21 |
21 |
| 0 |
21 |
21 |
| 0 |
21 |
21 |
| 3 |
25 |
21 |
| 3 |
24 |
21 |
| 0 |
21 |
21 |
| 1 |
21 |
20 |
| 0 |
20 |
20 |
| 3 |
24 |
20 |
| 0 |
21 |
20 |
| 5 |
25 |
20 |
| 4 |
24 |
20 |
| 1 |
21 |
20 |
| 3 |
23 |
20 |
| 2 |
23 |
20 |
| 3 |
23 |
20 |
| 5 |
24 |
19 |
| 4 |
22 |
19 |
| 0 |
19 |
19 |
| 0 |
19 |
19 |
| 0 |
19 |
19 |
| 0 |
19 |
19 |
| 4 |
23 |
19 |
| 0 |
19 |
19 |
| 0 |
19 |
19 |
| 0 |
19 |
19 |
| 0 |
19 |
19 |
| 2 |
21 |
19 |
| 0 |
19 |
19 |
| 0 |
18 |
18 |
| 0 |
18 |
18 |
| 5 |
23 |
18 |
| 0 |
18 |
18 |
| 5 |
24 |
18 |
| 6 |
24 |
18 |
| 0 |
18 |
18 |
| 5 |
24 |
18 |
| 0 |
18 |
18 |
| 0 |
18 |
18 |
| 0 |
17 |
17 |
| 0 |
17 |
17 |
| 7 |
25 |
17 |
| 0 |
17 |
17 |
| 0 |
17 |
17 |
| 0 |
17 |
17 |
| 6 |
24 |
17 |
| 7 |
24 |
17 |
| 6 |
24 |
17 |
| 6 |
24 |
17 |
| 0 |
17 |
17 |
| 0 |
16 |
16 |
| 0 |
16 |
16 |
| 0 |
16 |
16 |
| 0 |
16 |
16 |
| 0 |
16 |
16 |
| 0 |
16 |
16 |
| 0 |
16 |
16 |
| 8 |
24 |
16 |
| 9 |
24 |
15 |
| 0 |
15 |
15 |
| 9 |
24 |
15 |
| 0 |
15 |
15 |
| 1 |
16 |
15 |
| 0 |
15 |
15 |
| 9 |
23 |
14 |
| 0 |
14 |
14 |
| 0 |
14 |
14 |
| 1 |
16 |
14 |
| 0 |
14 |
14 |
| 1 |
16 |
14 |
| 0 |
14 |
14 |
| 0 |
14 |
14 |
| 0 |
14 |
14 |
| 0 |
14 |
14 |
| 0 |
14 |
14 |
| 0 |
14 |
14 |
| 11 |
25 |
14 |
| 8 |
23 |
14 |
| 0 |
14 |
14 |
| 4 |
18 |
14 |
| 0 |
14 |
14 |
| 10 |
24 |
14 |
| 0 |
14 |
14 |
| 0 |
14 |
14 |
| 7 |
21 |
13 |
| 9 |
23 |
13 |
| 1 |
14 |
13 |
| 0 |
13 |
13 |
| 0 |
14 |
13 |
| 0 |
13 |
13 |
| 0 |
13 |
13 |
| 0 |
13 |
13 |
| 10 |
24 |
13 |
| 0 |
13 |
13 |
| 0 |
13 |
13 |
| 11 |
24 |
13 |
| 11 |
24 |
13 |
| 11 |
25 |
13 |
| 10 |
23 |
13 |
| 0 |
13 |
13 |
| 7 |
19 |
12 |
| 0 |
12 |
12 |
| 0 |
12 |
12 |
| 6 |
19 |
12 |
| 0 |
12 |
12 |
| 0 |
12 |
12 |
| 0 |
12 |
12 |
| 0 |
12 |
12 |
| 0 |
12 |
12 |
| 0 |
12 |
12 |
| 0 |
12 |
12 |
| 0 |
12 |
12 |
| 0 |
12 |
12 |
| 7 |
19 |
12 |
| 0 |
12 |
12 |
| 12 |
24 |
12 |
| 0 |
12 |
12 |
| 2 |
15 |
12 |
| 0 |
12 |
12 |
| 0 |
12 |
12 |
| 0 |
12 |
12 |
| 0 |
11 |
11 |
| 0 |
11 |
11 |
| 0 |
11 |
11 |
| 4 |
15 |
11 |
| 0 |
11 |
11 |
| 2 |
13 |
11 |
| 0 |
11 |
11 |
| 0 |
11 |
11 |
| 0 |
11 |
11 |
| 0 |
11 |
11 |
| 3 |
14 |
11 |
| 1 |
12 |
11 |
| 0 |
11 |
11 |
| 0 |
11 |
11 |
| 1 |
12 |
11 |
| 13 |
24 |
11 |
| 8 |
19 |
11 |
| 12 |
23 |
11 |
| 0 |
11 |
11 |
| 0 |
11 |
11 |
| 2 |
13 |
11 |
| 2 |
14 |
11 |
| 0 |
11 |
11 |
| 0 |
11 |
11 |
| 11 |
23 |
11 |
| 0 |
10 |
10 |
| 0 |
10 |
10 |
| 0 |
10 |
10 |
| 0 |
10 |
10 |
| 8 |
19 |
10 |
| 0 |
10 |
10 |
| 0 |
10 |
10 |
| 4 |
15 |
10 |
| 2 |
12 |
10 |
| 0 |
10 |
10 |
| 0 |
10 |
10 |
| 0 |
10 |
10 |
| 0 |
10 |
10 |
| 6 |
16 |
10 |
| 0 |
10 |
10 |
| 12 |
23 |
10 |
| 0 |
9 |
9 |
| 0 |
9 |
9 |
| 0 |
9 |
9 |
| 15 |
24 |
9 |
| 0 |
9 |
9 |
| 0 |
9 |
9 |
| 2 |
12 |
9 |
| 0 |
9 |
9 |
| 0 |
9 |
9 |
| 14 |
24 |
9 |
| 0 |
9 |
9 |
| 0 |
9 |
9 |
| 0 |
9 |
9 |
| 0 |
9 |
9 |
| 4 |
13 |
9 |
| 1 |
11 |
9 |
| 14 |
24 |
9 |
| 0 |
9 |
9 |
| 2 |
11 |
9 |
| 0 |
9 |
9 |
| 0 |
9 |
9 |
| 2 |
12 |
9 |
| 0 |
9 |
9 |
| 0 |
9 |
9 |
| 0 |
9 |
9 |
| 0 |
9 |
9 |
| 0 |
9 |
9 |
| 0 |
10 |
9 |
| 0 |
9 |
9 |
| 0 |
9 |
9 |
| 0 |
9 |
9 |
| 0 |
8 |
8 |
| 0 |
8 |
8 |
| 0 |
8 |
8 |
| 15 |
24 |
8 |
| 0 |
8 |
8 |
| 0 |
8 |
8 |
| 0 |
8 |
8 |
| 0 |
8 |
8 |
| 0 |
8 |
8 |
| 0 |
8 |
8 |
| 3 |
12 |
8 |
| 0 |
8 |
8 |
| 9 |
17 |
8 |
| 0 |
9 |
8 |
| 0 |
8 |
8 |
| 0 |
8 |
8 |
| 0 |
8 |
8 |
| 1 |
10 |
8 |
| 0 |
8 |
8 |
| 2 |
10 |
8 |
| 0 |
8 |
8 |
| 0 |
8 |
8 |
| 0 |
8 |
8 |
| 0 |
8 |
8 |
| 0 |
8 |
8 |
| 0 |
8 |
8 |
| 0 |
8 |
8 |
| 0 |
8 |
8 |
| 0 |
8 |
8 |
| 0 |
8 |
8 |
| 0 |
9 |
8 |
| 1 |
9 |
8 |
| 17 |
25 |
8 |
| 3 |
12 |
8 |
| 4 |
11 |
7 |
| 3 |
10 |
7 |
| 0 |
7 |
7 |
| 0 |
7 |
7 |
| 0 |
7 |
7 |
| 11 |
18 |
7 |
| 0 |
7 |
7 |
| 14 |
21 |
7 |
| 0 |
7 |
7 |
| 0 |
7 |
7 |
| 0 |
7 |
7 |
| 0 |
7 |
7 |
| 0 |
7 |
7 |
| 0 |
7 |
7 |
| 0 |
7 |
7 |
| 0 |
7 |
7 |
| 0 |
7 |
7 |
| 0 |
7 |
7 |
| 0 |
7 |
7 |
| 0 |
7 |
7 |
| 3 |
10 |
7 |
| 17 |
24 |
7 |
| 0 |
7 |
7 |
| 0 |
7 |
7 |
| 0 |
7 |
7 |
| 9 |
16 |
7 |
| 0 |
7 |
7 |
| 11 |
18 |
7 |
| 0 |
7 |
7 |
| 0 |
7 |
7 |
| 0 |
7 |
7 |
| 1 |
8 |
7 |
| 0 |
7 |
7 |
| 3 |
10 |
7 |
| 0 |
7 |
7 |
| 0 |
7 |
7 |
| 0 |
7 |
7 |
| 17 |
24 |
7 |
| 0 |
7 |
7 |
| 0 |
7 |
7 |
| 0 |
7 |
7 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 18 |
24 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 9 |
15 |
6 |
| 0 |
6 |
6 |
| 1 |
8 |
6 |
| 0 |
7 |
6 |
| 0 |
6 |
6 |
| 1 |
7 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 8 |
14 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 18 |
24 |
6 |
| 11 |
17 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
7 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 17 |
24 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 1 |
7 |
6 |
| 1 |
8 |
6 |
| 1 |
8 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 5 |
11 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 18 |
24 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
6 |
6 |
| 0 |
7 |
6 |
| 0 |
6 |
6 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 1 |
6 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 13 |
19 |
5 |
| 2 |
7 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 7 |
12 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 8 |
14 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 2 |
7 |
5 |
| 0 |
5 |
5 |
| 0 |
5 |
5 |
| 1 |
6 |
5 |
| 2 |
8 |
5 |
| 6 |
11 |
5 |
| 0 |
5 |
5 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 1 |
5 |
4 |
| 0 |
4 |
4 |
| 6 |
10 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 12 |
16 |
4 |
| 0 |
4 |
4 |
| 6 |
10 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 7 |
11 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 7 |
11 |
4 |
| 0 |
4 |
4 |
| 0 |
5 |
4 |
| 0 |
4 |
4 |
| 3 |
7 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 2 |
6 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 19 |
23 |
4 |
| 0 |
4 |
4 |
| 1 |
5 |
4 |
| 0 |
4 |
4 |
| 9 |
14 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 0 |
4 |
4 |
| 12 |
16 |
4 |
| 4 |
8 |
4 |
| 6 |
9 |
3 |
| 3 |
6 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 19 |
23 |
3 |
| 8 |
12 |
3 |
| 19 |
22 |
3 |
| 0 |
3 |
3 |
| 1 |
4 |
3 |
| 5 |
8 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 2 |
6 |
3 |
| 0 |
3 |
3 |
| 1 |
4 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 1 |
5 |
3 |
| 14 |
18 |
3 |
| 0 |
3 |
3 |
| 3 |
7 |
3 |
| 0 |
3 |
3 |
| 4 |
7 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 5 |
8 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 1 |
5 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 19 |
23 |
3 |
| 4 |
7 |
3 |
| 0 |
3 |
3 |
| 13 |
16 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 21 |
24 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 0 |
4 |
3 |
| 20 |
24 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 1 |
4 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 0 |
3 |
3 |
| 3 |
6 |
2 |
| 9 |
12 |
2 |
| 2 |
4 |
2 |
| 9 |
12 |
2 |
| 0 |
2 |
2 |
| 0 |
3 |
2 |
| 4 |
6 |
2 |
| 0 |
2 |
2 |
| 19 |
21 |
2 |
| 0 |
2 |
2 |
| 5 |
7 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 10 |
13 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 18 |
20 |
2 |
| 0 |
3 |
2 |
| 0 |
3 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 1 |
3 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 3 |
5 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 1 |
4 |
2 |
| 0 |
2 |
2 |
| 3 |
6 |
2 |
| 0 |
2 |
2 |
| 1 |
4 |
2 |
| 0 |
3 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 6 |
8 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 21 |
24 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 9 |
11 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 5 |
7 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 4 |
6 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 6 |
9 |
2 |
| 0 |
2 |
2 |
| 0 |
3 |
2 |
| 0 |
2 |
2 |
| 1 |
4 |
2 |
| 1 |
4 |
2 |
| 3 |
5 |
2 |
| 0 |
3 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 0 |
2 |
2 |
| 2 |
4 |
2 |
| 0 |
2 |
2 |
| 9 |
11 |
2 |
| 0 |
1 |
1 |
| 1 |
3 |
1 |
| 4 |
5 |
1 |
| 20 |
22 |
1 |
| 0 |
1 |
1 |
| 2 |
3 |
1 |
| 11 |
13 |
1 |
| 20 |
22 |
1 |
| 1 |
2 |
1 |
| 19 |
20 |
1 |
| 0 |
2 |
1 |
| 16 |
18 |
1 |
| 16 |
18 |
1 |
| 11 |
12 |
1 |
| 0 |
1 |
1 |
| 8 |
9 |
1 |
| 0 |
1 |
1 |
| 0 |
1 |
1 |
| 0 |
1 |
1 |
| 0 |
1 |
1 |
| 0 |
1 |
1 |
| 0 |
1 |
1 |
| 2 |
4 |
1 |
| 7 |
8 |
1 |
| 0 |
1 |
1 |
| 0 |
1 |
1 |
| 0 |
2 |
1 |
| 0 |
1 |
1 |
| 4 |
5 |
1 |
| 7 |
8 |
1 |
| 0 |
1 |
1 |
| 4 |
6 |
1 |
| 0 |
1 |
1 |
| 0 |
1 |
1 |
| 1 |
3 |
1 |
| 0 |
1 |
1 |
| 5 |
6 |
1 |
| 1 |
2 |
1 |
| 0 |
1 |
1 |
| 3 |
5 |
1 |
| 6 |
8 |
1 |
| 0 |
1 |
1 |
| 1 |
2 |
1 |
| 0 |
1 |
1 |
| 0 |
1 |
1 |
| 0 |
1 |
1 |
| 0 |
1 |
1 |
| 11 |
12 |
1 |
| 6 |
8 |
1 |
| 0 |
1 |
1 |
| 0 |
1 |
1 |
| 2 |
3 |
1 |
| 7 |
8 |
1 |
| 0 |
1 |
1 |
| 0 |
1 |
1 |
| 4 |
5 |
1 |
| 5 |
6 |
1 |
| 0 |
1 |
1 |
| 9 |
11 |
1 |
| 0 |
1 |
1 |
| 1 |
2 |
1 |
| 0 |
1 |
1 |
| 6 |
7 |
1 |
| 2 |
3 |
1 |
| 0 |
1 |
1 |
| 15 |
17 |
1 |
| 0 |
1 |
1 |
| 2 |
3 |
1 |
| 0 |
1 |
1 |
| 0 |
2 |
1 |
| 3 |
4 |
1 |
| 0 |
1 |
1 |
| 6 |
7 |
1 |
| 0 |
1 |
1 |
| 0 |
1 |
1 |
| 0 |
1 |
1 |
| 0 |
1 |
1 |
| 0 |
2 |
1 |
| 0 |
1 |
1 |
| 3 |
4 |
1 |
| 0 |
1 |
1 |
| 0 |
2 |
1 |
We have 97 users, who learned all alphabetical without changing
settings.
How much time it takes to learn Morse code?
Even though we usually don’t know real time, which was required for
each user to learn Morse code, we can estimate it. Let’s take all users,
who learned at least 70% of alphabetical, calculate speed of that
progress and estimate, how much time it would take for them to learn
Morse code.
Warning: Removed 2 rows containing non-finite values (stat_bin).
Warning: Removed 2 rows containing missing values (geom_bar).

Red lines shows quantiles 50%, 80% and 90%. So 80% of people need
less than 80 minutes for memorizing all letters. 90% need less than 2
hours. And most of the rest 10% probably people, who took long break
during playing.
Below is same plot, but with people who learned all letters, not only
70%+.
Warning: Removed 1 rows containing non-finite values (stat_bin).
Warning: Removed 2 rows containing missing values (geom_bar).

Now let’s take another look at estimated time, this time we will
check, is it correct to estimate time by shorter periods of
learning.
Warning: Removed 83 rows containing non-finite values
(stat_ydensity).

People who learned less than 60% letters during that sessions for
some reason has too high estimated speed, so we should estimate it by
sessions with 60%+. Looks like for average people learning whole
alphabetical takes ~60 minutes.
Below is the same plot, but only for people who played with settings
without any clues.

How speed of the progress changes during the game?
Let’s take those users, who learned whole alphabeticall and see, how
their speed changed during the game.
Units for speed are amount of letters, which would be learned in 10
minutes with that speed.
`geom_smooth()` using method = 'loess' and formula 'y ~ x'
Warning: Removed 330 rows containing non-finite values
(stat_smooth).

At beginning of the game we can see is a peak of speed, for first
letters, but after that speed looks constant and usually around 3%. Mean
speed is 3%.
For some users progress slows down (speed is negative), for others
its never going back and they speed up.
Which hint options are better for learning?
Now let’s compare, how much time requires learning with different
hint settings.
| Minutes |
Visual hints |
Speech hints |
Sound enabled |
Users |
Total leters |
| 40 |
++ |
– |
– |
24 |
526 |
| 42 |
++ |
– |
++ |
51 |
1112 |
| 43 |
– |
– |
++ |
21 |
458 |
| 44 |
– |
++ |
++ |
12 |
270 |
| 50 |
++ |
++ |
++ |
66 |
1469 |
With our current amount of data we can’t make reliable conlusions
about which clue settings are more effective.
This is same table, but only for users who learned all alphabetical
without changing settings:
| Minutes |
Visual hints |
Speech hints |
Sound enabled |
Users |
Total leters |
| 38 |
++ |
– |
– |
11 |
260 |
| 38 |
++ |
– |
++ |
16 |
385 |
| 42 |
– |
– |
++ |
9 |
209 |
| 43 |
– |
++ |
++ |
9 |
216 |
| 48 |
++ |
++ |
++ |
36 |
865 |
– – – – – – – – – – – – – –
Below is the older section, which is proved to be wrong after we did
find out that speed of users with too short session (less than 70%)
estimated too high. Sessions without any clues wre shorter, that’s why
we estimated their speed higher.
Now let’s compare, how much time requires learning with different
hint settings. At first look its like this:
| Minutes |
Visual hints |
Speech hints |
Sound enabled |
Users |
Total leters |
| 26 |
– |
– |
– |
7 |
46 |
| 28 |
– |
– |
++ |
134 |
1239 |
| 29 |
++ |
– |
– |
106 |
1051 |
| 34 |
– |
++ |
++ |
43 |
456 |
| 36 |
++ |
– |
++ |
163 |
1977 |
| 41 |
++ |
++ |
– |
20 |
195 |
| 41 |
++ |
++ |
++ |
193 |
2453 |
According to this table, the best option is to play only with sound
and without hints. But we must check, how statistically significant
those differences are.
With our current amount of data we can’t make reliable conlusions
about which clue settings are more effective.
In order to avoid misinterpretations, I will try to put my words very
precisely in this part. Might be a bit repetitive.
After series of T-tests, according to our data, we can make those
statements, which are totally independent of each other:
Visual hints
- When sound is enabled, but speech hints aren’t, we can be sure with
100% certainty, that disabling visual hints will
usually speed up learning process.
- When sound and speech hints are enabled, we can be sure with at
least 99% certainty, that disabling visual hints will
usually speed up learning process.
Speech hints
- When sound and visual hints are enabled, there is no significance
enough difference between enabling and disabling speech hints. Probably
there is some small difference, but with our current amount of data we
can’t catch so small differences.
- When visual hints are enabled, but sound isn’t, we can be sure with
at least 99% certainty, that disabling speech hints
will usually speed up learning process.
Sound
- When visual hints are enabled, but speech hints aren’t, we can be
sure with at least 100% certainty, that disabling
sound will usually speed up learning process.
Accuracy for each letter
We took accuracy stats from each user only until they got 10 success
trials for this letter. Column “Visual+” shows amount of correct inputs,
while visual hints were shown. “Visual-” shows mistakes and “Visual%”
shows percent of mistakes.
Letters with too insignificant amount of data not shown.
Looks like some visual hints makes it very hard to learn letter — B,
H, R, K, E.
“F” might be just a hard letter.
Some visual hints probably makes it easier, for example L and U.
But for most letters accuracy is better without any clues.
Speech clue aren’t affect learning process that much as visual —
accuracy for them is more similar with “no hints” option.
LS0tCnRpdGxlOiAnTW9yc2UgY29kZSBsZWFybmluZycKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3IgaW1wb3J0X2xpYnJhcmllcywgbWVzc2FnZT1GLCBlY2hvPUYsIHdhcm5pbmc9Rn0KIyBMb2FkaW5nIHJlcXVpcmVkIGxpYnJhcmllcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KG9wZW54bHN4KQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoUk15U1FMKQoKdGhlbWVfc2V0KHRoZW1lX2xpZ2h0KCkpCm9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpCgojc2V0d2QoJ0U6L1B5dGhvbi9SX3NjcmlwdHMvY29tcGxldGVkL21vcnNlX2NvZGVfbGVhcm5pbmcnKQpzZXR3ZCgnL2Nsb3VkL3Byb2plY3QvbW9yc2UtZGF0YS8nKSAgICAjIEZvciBSU3R1ZGlvIGNsb3VkLgp1cGRhdGVfZGF0YSA9IFQgICAgIyBJZiBpdCdzIFRSVUUsIHRoZW4gcmVhZCBuZXcgZGF0YSBmcm9tIFNRTCBhbmQgc2F2ZSB0byBjc3YuIEJ1dCBpdCB0YWtlcyB0aW1lLCBzbyBpZiBpdHMgRkFMU0UsIHRoZW4ganVzdCByZWFkIGRhdGEgZnJvbSBjc3YKYGBgCmBgYHtyIGxvYWRpbmd9CmlmKHVwZGF0ZV9kYXRhKSB7CiAgc3FsX2NvbiA9IGRiQ29ubmVjdChNeVNRTCgpLCBob3N0ID0gIjEwOS4xMDcuMzguMjU1IiwgcG9ydCA9IDMzMDYsIHVzZXIgPSAid3dhZGUiLCBwYXNzd29yZCA9ICdhZj9vSEQ5NWNvOCM/a25BJywgZGJfbmFtZSA9ICJtb3JzZV9sZWFybiIsIHRpbWVvdXQgPSAxMCkKICBycyA9IGRiU2VuZFF1ZXJ5KHNxbF9jb24sICdzZWxlY3QgKiBmcm9tIG1vcnNlX2xlYXJuLnByb2dyZXNzX2xvZycpCiAgZCA9IGZldGNoKHJzLCBuID0gLTEpCiAgb24uZXhpdChkYkRpc2Nvbm5lY3Qoc3FsX2NvbikpCiAgd3JpdGUuY3N2KGQsICdwcm9ncmVzc19sb2cuY3N2JykKfSBlbHNlIHsKICBkID0gcmVhZC5jc3YoJ3Byb2dyZXNzX2xvZy5jc3YnKSB9CmBgYApgYGB7ciB0cmFuc2Zvcm1pbmd9CiMgVHJhbnNmb3JtaW5nIGRhdGEKbGV0dGVycyA9IGMoJ2UnLCd0JywnYScsJ2knLCdtJywncycsJ28nLCdoJywnbicsJ2MnLCdyJywnZCcsJ3UnLCdrJywnbCcsJ2YnLCdiJywncCcsJ2cnLCdqJywndicsJ3EnLCd3JywneCcsJ3knLCd6JykKCnRvX2xldHRlcnMgPSBmdW5jdGlvbihwcm9ncmVzcykgewogIHByb2dyZXNzX2xldHRlcnMgPSBwcm9ncmVzcyAqIDEuMDQgLyA0CiAgbGV0dGVyc19sZWFybmVkID0gcm91bmQocHJvZ3Jlc3NfbGV0dGVycyAqIDUpICUvJSA1CiAgbGV0dGVyc19sZWFybmVkID0gaWZlbHNlKGxldHRlcnNfbGVhcm5lZCA8IDAsIDAsIGxldHRlcnNfbGVhcm5lZCkgJT4lCiAgICBhcy5pbnRlZ2VyKCkKfQoKZCAlPD4lCiAgbXV0YXRlKHNjb3JlcyA9IHN0cl9leHRyYWN0X2FsbChwcm9ncmVzc0R1bXAsICctKlswLTldJyksCiAgICAgICAgIG1pbnV0ZXMgPSB0aW1lUGxheWVkIC8gMTAwMCAvIDYwLAogICAgICAgICBzZXR0aW5ncyA9IHBhc3RlMCh2aXN1YWxIaW50cywgc3BlZWNoSGludHMsIHNvdW5kKSwKICAgICAgICAgdXNlciA9IHVzZXJJZGVudGlmaWVyLAogICAgICAgICBwcm9ncmVzcyA9IGlmZWxzZShwcm9ncmVzc1BlcmNlbnQgPCAwLCAwLCBwcm9ncmVzc1BlcmNlbnQpLAogICAgICAgICBsZXR0ZXJzX2xlYXJuZWQgPSB0b19sZXR0ZXJzKHByb2dyZXNzKSwKICAgICAgICAgZGF0ZSA9IHBhcnNlX2RhdGVfdGltZShkYXRlQ3JlYXRlZCwgJ3ktbS1kIEg6TTpTJyksCiAgICAgICAgIGFjY3VyYWN5ID0gcHJvZ3Jlc3NEZXRhaWwKICAgICAgICApICU+JQogIHNlbGVjdCh1c2VyLCBzZXR0aW5ncywgbWludXRlcywgcHJvZ3Jlc3MsIGxldHRlcnNfbGVhcm5lZCwgYWNjdXJhY3ksIHNjb3JlcywgZGF0ZSkgJT4lCiAgYXJyYW5nZSh1c2VyLCBtaW51dGVzKQoKZCRzcGVlZCA9IE5BICAgICMgQ2FsY3VsYXRpbmcgc3BlZWQgb2YgcHJvZ3Jlc3MgZm9yIGV2ZXJ5IHN0ZXAKZCRhZnRlcnBsYXkgPSBGICMgSWYgVFJVRSwgdGhlbiBpdCdzIHRpbWUgYWZ0ZXIgYWxwaGFiZXRpY2FsIHdhcyBhbHJlYWR5IGxlYXJuZWQKbGFzdF9taW51dGVzID0gZCRtaW51dGVzWzFdCmxhc3RfcHJvZ3Jlc3MgPSBkJHByb2dyZXNzWzFdCmxhc3RfdXNlciA9IGQkdXNlclsxXQpyZWFjaGVkX2VuZCA9IEYKZm9yIChpIGluIDE6bnJvdyhkKSkgewogIGlmIChkJHVzZXJbaV0gPT0gbGFzdF91c2VyICYgZCRtaW51dGVzW2ldICE9IGxhc3RfbWludXRlcyAmIGQkcHJvZ3Jlc3NbaV0gIT0gbGFzdF9wcm9ncmVzcyAmICEocmVhY2hlZF9lbmQpKSB7CiAgICBkJHNwZWVkW2ldID0gKGQkcHJvZ3Jlc3NbaV0gLSBsYXN0X3Byb2dyZXNzKSAvIChkJG1pbnV0ZXNbaV0gLSBsYXN0X21pbnV0ZXMpCiAgICBsYXN0X21pbnV0ZXMgPSBkJG1pbnV0ZXNbaV0KICAgIGxhc3RfcHJvZ3Jlc3MgPSBkJHByb2dyZXNzW2ldCiAgfQogIGlmIChkJHVzZXJbaV0gIT0gbGFzdF91c2VyKSB7CiAgICBsYXN0X3VzZXIgPSBkJHVzZXJbaV0KICAgIGxhc3RfbWludXRlcyA9IGQkbWludXRlc1tpXQogICAgbGFzdF9wcm9ncmVzcyA9IGQkcHJvZ3Jlc3NbaV0KICAgIHJlYWNoZWRfZW5kID0gRgogIH0KICBpZihkJHVzZXJbaV0gPT0gbGFzdF91c2VyICYgcmVhY2hlZF9lbmQpIHsgZCRhZnRlcnBsYXlbaV0gPSBUIH0KICByZWFjaGVkX2VuZCA9IGQkc2NvcmVzW2ldW1sxXV1bMjZdID4gMCAgICMgYWxzbyBtYXJraW5nIHJvd3Mgd2l0aCByZWFjaGVkIGxhc3QgbGV0dGVyCiAgZCRyZWFjaGVkX2VuZFtpXSA9IHJlYWNoZWRfZW5kCn0KCiMgQ2FsY3VsYXRpbmcgYWNjdXJhY3kgZm9yIGVhY2ggbGV0dGVyCmRfbmV3ID0gZCAlPiUKICBmaWx0ZXIoIWlzLm5hKGFjY3VyYWN5KSkgJT4lCiAgYXJyYW5nZSh1c2VyLCBkYXRlKQphY2NfdHJpYWxzID0gMTAgICAjIEFmdGVyIGhvdyBtdWNoIHRyaWFscyB3ZSB3aWxsIG1lYXN1cmUgYWNjdXJhY3kgb2YgbGV0dGVyCgphY2NfdGFibGUgPSBmdW5jdGlvbihkYXRhKSB7CiAgYWNjdXJhY3kgPSBkYXRhLmZyYW1lKGxldHRlcj1sZXR0ZXJzLCBjb3JyZWN0PTAsIHdyb25nPTApCiAgdXNlcnMgPSB1bmlxdWUoZGF0YSR1c2VyKQogIGZvciAodXNlciBpbiB1c2Vycyl7CiAgICBmb3IgKGxldHRlciBpbiBsZXR0ZXJzKXsKICAgICAgZm9yIChyb3cgaW4gZGF0YVtkYXRhJHVzZXIgPT0gdXNlciwgJ2FjY3VyYWN5J10pIHsKICAgICAgICBjb3JyZWN0cyA9IHN0cl9leHRyYWN0KHJvdywgcGFzdGUwKGxldHRlciwgJyI6XFx7Indyb25nIjpcXGQrLCJjb3JyZWN0IjpcXGQrJykpCiAgICAgICAgY29ycmVjdHMgPSBhcy5udW1lcmljKHN0cl9yZXBsYWNlKGNvcnJlY3RzLCBwYXN0ZTAobGV0dGVyLCAnIjpcXHsid3JvbmciOlxcZCssImNvcnJlY3QiOicpLCAnJykpCiAgICAgICAgaWYgKGNvcnJlY3RzID49IGFjY190cmlhbHMpIHsKICAgICAgICAgIGFjY3VyYWN5W2FjY3VyYWN5JGxldHRlcj09bGV0dGVyLCAnY29ycmVjdCddID0gYWNjdXJhY3lbYWNjdXJhY3kkbGV0dGVyPT1sZXR0ZXIsICdjb3JyZWN0J10gKyBjb3JyZWN0cwogICAgICAgICAgd3JvbmdzID0gc3RyX2V4dHJhY3Qocm93LCBwYXN0ZTAobGV0dGVyLCAnIjpcXHsid3JvbmciOlxcZCsnKSkKICAgICAgICAgIHdyb25ncyA9IGFzLm51bWVyaWMoc3RyX3JlcGxhY2Uod3JvbmdzLCBwYXN0ZTAobGV0dGVyLCAnIjpcXHsid3JvbmciOicpLCAnJykpCiAgICAgICAgICBhY2N1cmFjeVthY2N1cmFjeSRsZXR0ZXI9PWxldHRlciwgJ3dyb25nJ10gPSBhY2N1cmFjeVthY2N1cmFjeSRsZXR0ZXI9PWxldHRlciwgJ3dyb25nJ10gKyB3cm9uZ3MKICAgICAgICAgIGJyZWFrCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGFjY3VyYWN5ICU8PiUgbXV0YXRlKG1pc3Rha2VfcGVyY2VudGFnZSA9IHdyb25nIC8gKGNvcnJlY3QgKyB3cm9uZykpCn0KCmNhbGN1bGF0ZV9hY2N1cmFjeSA9IEYgICMgRm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBjYWxjdWxhdGlvbiBvZiBhY2N1cmFjeSBjYW4gYmUgdHVybmVkIG9mZiwgc2luY2UgaXQgdGFrZXMgc28gbG9uZwoKaWYoY2FsY3VsYXRlX2FjY3VyYWN5KSB7CnZpc3VhbF9hY2N1cmFjeSA9IGRfbmV3ICU+JSBmaWx0ZXIoc2V0dGluZ3MgJWluJSBjKCcxMDAnLCAnMTAxJywgJzExMCcsICcxMTEnKSkgJT4lIGFjY190YWJsZSgpCnNwZWVjaF9hY2N1cmFjeSA9IGRfbmV3ICU+JSBmaWx0ZXIoc2V0dGluZ3MgJWluJSBjKCcwMTAnLCAnMTEwJywgJzAxMScsICcxMTEnKSkgJT4lIGFjY190YWJsZSgpCm5vaGludHNfYWNjdXJhY3kgPSBkX25ldyAlPiUgZmlsdGVyKHNldHRpbmdzICVpbiUgYygnMDAxJykpICU+JSBhY2NfdGFibGUoKQphY2N1cmFjeSA9IHZpc3VhbF9hY2N1cmFjeSAlPiUKICByaWdodF9qb2luKHNwZWVjaF9hY2N1cmFjeSwgYnkgPSAnbGV0dGVyJykgJT4lCiAgcmlnaHRfam9pbihub2hpbnRzX2FjY3VyYWN5LCBieSA9ICdsZXR0ZXInKQpjb2xuYW1lcyhhY2N1cmFjeSkgPSBjKCdsZXR0ZXInLCAndmlzdWFsKycsICd2aXN1YWwtJywgJ3Zpc3VhbCUnLCAnc3BlZWNoKycsICdzcGVlY2gtJywgJ3NwZWVjaCUnLCAnbm9oaW50cysnLCAnbm9oaW50cy0nLCAnbm9oaW50cyUnKQp9CgpnZXRfYWNjdXJhY3kgPSBmdW5jdGlvbihzdHJpbmcpIHsgICAgICMgVHJhbnNmb3JtcyBKU09OIGFjY3VyYWN5IHRvIGRhdGFmcmFtZQogIGxldHRlcnMgPSBzdHJfZXh0cmFjdF9hbGwoc3RyaW5nLCAnKC4pKD89IjpcXHspJykKICB3cm9uZ3MgPSBzdHJfZXh0cmFjdF9hbGwoc3RyaW5nLCAnKFxcZCspKD89LCJjb3JyKScpCiAgY29ycmVjdHMgPSBzdHJfZXh0cmFjdF9hbGwoc3RyaW5nLCAnKFxcZCspKD89XFx9KScpCiAgZGYgPSBkYXRhLmZyYW1lKGxldHRlciA9IGxldHRlcnMsIGNvcnJlY3QgPSBjb3JyZWN0cywgd3JvbmcgPSB3cm9uZ3MpCiAgY29sbmFtZXMoZGYpID0gYygnbGV0dGVyJywgJ2NvcnJlY3QnLCAnd3JvbmcnKQogIHJldHVybihkZikKfQoKc2NvcmVzX2Zvcl9hZ2dyID0gZCAlPiUgICMgTG9va2luZyBmb3IgdGhlIGxhdGVzdCBhY2N1cmFjeSB2YWx1ZXMgZm9yIGVhY2ggdXNlci4gV2lsbCBiZSBqb2luZWQgdG8gYWdncmVnYXRlZCBkYXRhCiAgZ3JvdXBfYnkodXNlcikgJT4lCiAgZmlsdGVyKGRhdGUgPT0gbWF4KGRhdGUpKSAlPiUKICBtdXRhdGUoc2NvcmVzID0gbGFwcGx5KGFjY3VyYWN5LCAnZ2V0X2FjY3VyYWN5JykpICU+JQogIHNlbGVjdChzY29yZXMpCgpkX2FnZ3IgPSBkICU+JSAgICAjIEFnZ3JlZ2F0aW5nIGRhdGEKICBmaWx0ZXIoIWFmdGVycGxheSkgJT4lCiAgZ3JvdXBfYnkodXNlciwgc2V0dGluZ3MpICU+JQogIHN1bW1hcml6ZShtaW51dGVzID0gbWF4KG1pbnV0ZXMpLAogICAgICAgICAgICBtaW5fcHJvZ3Jlc3MgPSBtaW4ocHJvZ3Jlc3MpLAogICAgICAgICAgICBtYXhfcHJvZ3Jlc3MgPSBtYXgocHJvZ3Jlc3MpLAogICAgICAgICAgICBtaW5fbGV0dGVycyA9IHRvX2xldHRlcnMobWluX3Byb2dyZXNzKSwKICAgICAgICAgICAgbWF4X2xldHRlcnMgPSB0b19sZXR0ZXJzKG1heF9wcm9ncmVzcyksCiAgICAgICAgICAgIHNldHRpbmdzID0gbWF4KHNldHRpbmdzKSwKICAgICAgICAgICAgcmVhY2hlZF9lbmQgPSBhcy5sb2dpY2FsKG1heChyZWFjaGVkX2VuZCkpLAogICAgICAgICAgICBwcm9ncmVzc19pbnRlcnZhbCA9IG1heF9wcm9ncmVzcyAtIG1pbl9wcm9ncmVzcywKICAgICAgICAgICAgbGV0dGVyc19sZWFybmVkID0gdG9fbGV0dGVycyhwcm9ncmVzc19pbnRlcnZhbCksCiAgICAgICAgICAgIHNwZWVkID0gcHJvZ3Jlc3NfaW50ZXJ2YWwgLyBtaW51dGVzLAogICAgICAgICAgICBlc3RfdGltZSA9IG1pbnV0ZXMgLyBwcm9ncmVzc19pbnRlcnZhbCAqIDEwMCwKICAgICAgICAgICAgc3RhcnRfZGF0ZSA9IGRhdGUobWluKGRhdGUpKQogICAgICAgICAgICkgJT4lCiAgbXV0YXRlKHZpc3VhbF9oaW50cyA9IHN0cl9zdWIoc2V0dGluZ3MsIDEsIDEpID09ICcxJywKICAgICAgICAgc3BlZWNoX2hpbnRzID0gc3RyX3N1YihzZXR0aW5ncywgMiwgMikgPT0gJzEnLAogICAgICAgICBzb3VuZCA9IHN0cl9zdWIoc2V0dGluZ3MsIDMsIDMpID09ICcxJykgJT4lCiAgcmlnaHRfam9pbihzY29yZXNfZm9yX2FnZ3IsIGJ5PSd1c2VyJykgJT4lCiAgYXJyYW5nZShkZXNjKHN0YXJ0X2RhdGUpKQpgYGAKIyMgTGFzdCBmaW5pc2hlcnMKYGBge3IgTGFzdF9maW5pc2hlcnN9CmRfYWdnciAlPiUKICBmaWx0ZXIocmVhY2hlZF9lbmQpICU+JQogIGdyb3VwX2J5KHN0YXJ0X2RhdGUpICU+JQogIGNvdW50KCkgJT4lCiAgYXJyYW5nZShkZXNjKHN0YXJ0X2RhdGUpKSAlPiUKICBtdXRhdGUoc3RhcnRfZGF0ZSA9IGFzLmNoYXJhY3RlcihzdGFydF9kYXRlKSkgJT4lCiAgZnVsbF9qb2luKGRhdGEuZnJhbWUoJ3N0YXJ0X2RhdGUnID0gJ1RvdGFsJywgJ24nID0gc3VtKGRfYWdnciRyZWFjaGVkX2VuZCA9PSBUKSkpICU+JQogIGthYmxlKGZvcm1hdCA9ICdodG1sJywgdGFibGUuYXR0ciA9ICdzdHlsZT0id2lkdGg6MzAlIicsIGFsaWduID0gJ2NjJywKICAgICAgICBjb2wubmFtZXMgPSBjKCdTdGFydGluZyBkYXRlJywgJ0Ftb3VudCBvZiBmaW5pc2hlcnMnKSkgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoJ2Jhc2ljJywgJ2hvdmVyJykpICU+JQogIHNjcm9sbF9ib3goaGVpZ2h0ID0gIjM1MHB4IikKYGBgCiMjIEFtb3VudCBvZiB1bmlxdWUgdXNlcnMKYGBge3J9CnVuaXF1ZV91c2VycyA9IGRfYWdnciAlPiUKICBmaWx0ZXIoc3RhcnRfZGF0ZSA+PSAnMjAyMS0wNi0yMicpICU+JQogIGdyb3VwX2J5KHVzZXIpICU+JQogIHN1bW1hcml6ZShzdGFydCA9IG1pbihzdGFydF9kYXRlKSwKICAgICAgICAgICAgc2V0dGluZ3NfY2hhbmdlcyA9IG4oKS0xLAogICAgICAgICAgICBwcm9ncmVzc19pbnRlcnZhbCA9IG1pbihyb3VuZChzdW0ocHJvZ3Jlc3NfaW50ZXJ2YWwpIC8gMjUpKjI1LCAxMDApICU+JSBmYWN0b3IobGV2ZWxzID0gYygwLCAyNSwgNTAsIDc1LCAxMDApKSkKYGBgClRoZXJlIHdhcyAqKmByIG5yb3codW5pcXVlX3VzZXJzKWAqKiB1bmlxdWUgdXNlcnMgc2luY2UgMjAyMS0wNi0yMiAod2hlbiBkZXNpZ24gb2YgZGF0YSBjb2xsZWN0aW9uIHdhcyBjaGFuZ2VkKS4KYGBge3J9CmdncGxvdCh1bmlxdWVfdXNlcnMpICsKICBnZW9tX2JhcihhZXMoc3RhcnQpLCBmaWxsID0gJyM1NUFBMjInKSArCiAgbGFicyh4PSdEYXRlJywgeT0nQW1vdW50IG9mIG5ldyB1c2VycycpCmBgYAoKUGxvdCBiZWxvdyBzaG93cywgaG93IG1hbnkgdGltZXMgcGVvcGxlIGNoYW5nZWQgdGhlaXIgY2x1ZSBzZXR0aW5ncy4KUGVyY2VudGFnZSBvbiB0b3Agb2YgZWFjaCBjb2x1bW4gc2hvd3MgJSBvZiBwZW9wbGUgd2l0aCBzYW1lIGxlbmd0aCBvZiBwcm9ncmVzcy4KYGBge3J9CnVuaXF1ZV91c2VycyAlPiUKICBjb3VudChzZXR0aW5nc19jaGFuZ2VzLCBwcm9ncmVzc19pbnRlcnZhbCkgJT4lCiAgZ3JvdXBfYnkocHJvZ3Jlc3NfaW50ZXJ2YWwpICU+JQogIG11dGF0ZShwZXJjZW50ID0gcGFzdGUwKHJvdW5kKG4vc3VtKG4pKjEwMCksICclJykpICU+JQogIGdncGxvdCgpICsKICAgIGFlcyhzZXR0aW5nc19jaGFuZ2VzLCBuLCBmaWxsID0gcHJvZ3Jlc3NfaW50ZXJ2YWwpICsKICAgIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlMicpICsKICAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9J0JsdWVzJykgKwogICAgbGFicyh4PSdIb3cgbWFueSB0aW1lcyBzZXR0aW5ncyB3YXMgY2hhbmdlZCcsIHk9J0Ftb3VudCBvZiB1c2VycycsIGZpbGwgPSAnUHJvZ3Jlc3MnKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudCksIHZqdXN0PS0wLjUsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuOSksIHNpemU9MikKYGBgCgojIyBIb3cgZmFyIHBlb3BsZSB1c3VhbGx5IGdvPwpJbiB0aGUgY3VycmVudCBkZXNpZ24gb2YgZGF0YSBjb2xsZWN0aW9uLCBtYW55IHVzZXJzIGFyZSBjb3VudGVkIGFzIGZldyB1c2Vycywgbm90IGp1c3Qgb25lLgpGb3IgZXhhbXBsZSwgaW5zdGVhZCBvZiAxIHVzZXIgd2hvIGxlYXJuZWQgMjAgbGV0dGVycywgd2UgbWlnaHQgaGF2ZSAzIHVzZXJzIOKAkwpvbmUgbGVhcm5lZCBvbmx5IDMgbGV0dGVycywgc2Vjb25kIGxlYXJuZWQgMTIgYW5kIHRoaXJkIOKAlCA1LgoKU28gd2UgY2FuJ3QgcmVhbGx5IHRlbGwsIGhvdyBmYXIgaW4gcHJvZ3Jlc3MgcGVvcGxlIHVzdWFsbHkgZ28uCkluc3RlYWQsIGxldCdzIHRha2UgYSBsb29rIGF0IGRpc3RyaWJ1dGlvbiBvZiBsZWFybmVkIGxldHRlcnMgd2UgaGF2ZSBpbiBvdXIgZGF0YXNldC4KYGBge3IgaG93X2Zhcn0KZF9hZ2dyICU+JQogIGZpbHRlcihzdGFydF9kYXRlID49ICcyMDIxLTA2LTIzJykgJT4lCiAgZ2dwbG90KGFlcyhsZXR0ZXJzX2xlYXJuZWQpKSArCiAgICBnZW9tX2hpc3RvZ3JhbShmaWxsID0gJyMwMEFBMjInLCBiaW5zPTIwKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygwLCA1LCAxMCwgMTUsIDIwLCAyNikpICsKICAgIHhsYWIoJ0xldHRlcnMgbGVhcm5lZCcpICsgeWxhYignQW1vdW50IG9mIHVzZXJzJykgKwogICAgdGhlbWVfY2xhc3NpYygpCmBgYApNb3N0IHVzZXJzIGRyb3BwZWQgaXQgcmlnaHQgYXdheS4gVGhpcyBpcyB0byBiZSBleHBlY3RlZC4gTWFueSBwZW9wbGUgbWF5IHN0dW1ibGUgdXBvbiB0aGUgc2l0ZSAtIG9yIHJlYWQgYWJvdXQgaXQgYW5kIHN0YXJ0IHRoZSBnYW1lIGJ1dCBub3QgcmVhbGlzZSB3aGF0IGl0cyBhbGwgYWJvdXQuIFNvbWUgbWF5IHN0YXJ0IGFuZCByZXN0YXJ0IG9uIGEgZGlmZmVyZW50IGRldmljZSB3aGljaCB3aWxsIGdldCByZWNvZ25pc2VkIGFzIGEgbmV3IHNlc3Npb24uIFJlbWVtYmVyIHdlIGRvbid0IHVzZSB1c2VybmFtZXMvbG9naW5zLgoKSGVyZSBpcyB0aGUgdGFibGUsIHdoaWNoIHNob3dzIGFtb3VudCBvZiBsZWFybmVkIGxldHRlcnMgZm9yIGVhY2ggdXNlcjoKYGBge3IgdGFibGVfb2ZfcHJvZ3Jlc3N9CmRfYWdnclssIGMoJ21pbl9sZXR0ZXJzJywgJ21heF9sZXR0ZXJzJywgJ2xldHRlcnNfbGVhcm5lZCcpXSAlPiUKICAgIGZpbHRlcihsZXR0ZXJzX2xlYXJuZWQgPiAwKSAlPiUKICAgIGFycmFuZ2UoZGVzYyhsZXR0ZXJzX2xlYXJuZWQpKSAlPiUKICAgIGthYmxlKGZvcm1hdD0naHRtbCcsIHRhYmxlLmF0dHIgPSAnc3R5bGU9IndpZHRoOjQwJSInLAogICAgICAgICAgY29sLm5hbWVzPWMoJ1N0YXJ0aW5nIGxldHRlcicsICdMYXN0IGxldHRlcicsICdBbW91bnQgb2YgbGV0dGVycycpLCBhbGlnbiA9ICdjY2MnKSAlPiUKICAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCdzdHJpcGVkJywgJ2hvdmVyJykpICU+JQogICAgc2Nyb2xsX2JveChoZWlnaHQgPSAiNTAwcHgiKQpgYGAKYGBge3J9CmFsbF9pbl9vbmVfc2Vzc2lvbiA9IGRfYWdnciAlPiUKICBmaWx0ZXIocmVhY2hlZF9lbmQsIG1pbl9sZXR0ZXJzID09MCkgJT4lCiAgbnJvdygpCmBgYAoKV2UgaGF2ZSBgciBhbGxfaW5fb25lX3Nlc3Npb25gIHVzZXJzLCB3aG8gbGVhcm5lZCBhbGwgYWxwaGFiZXRpY2FsIHdpdGhvdXQgY2hhbmdpbmcgc2V0dGluZ3MuCgojIyBIb3cgbXVjaCB0aW1lIGl0IHRha2VzIHRvIGxlYXJuIE1vcnNlIGNvZGU/CgpFdmVuIHRob3VnaCB3ZSB1c3VhbGx5IGRvbid0IGtub3cgcmVhbCB0aW1lLCB3aGljaCB3YXMgcmVxdWlyZWQgZm9yIGVhY2ggdXNlciB0byBsZWFybiBNb3JzZSBjb2RlLCB3ZSBjYW4gZXN0aW1hdGUgaXQuCkxldCdzIHRha2UgYWxsIHVzZXJzLCB3aG8gbGVhcm5lZCBhdCBsZWFzdCA3MCUgb2YgYWxwaGFiZXRpY2FsLApjYWxjdWxhdGUgc3BlZWQgb2YgdGhhdCBwcm9ncmVzcyBhbmQgZXN0aW1hdGUsIGhvdyBtdWNoIHRpbWUgaXQgd291bGQgdGFrZSBmb3IgdGhlbSB0byBsZWFybiBNb3JzZSBjb2RlLgoKYGBge3IgaG93X211Y2hfdGltZX0KdGltZV9kaXN0cmlidXRpb24gPSBmdW5jdGlvbihkX2FnZ3IsIHRyZXNoaG9sZCA9IDcwLCB0aXRsZT0nJywgeGxhYj0nRXN0aW1hdGVkIHRpbWUgdG8gbGVhcm4gTW9yc2UgY29kZScpIHsKUTEgPSBxdWFudGlsZShkX2FnZ3IkZXN0X3RpbWVbZF9hZ2dyJHByb2dyZXNzX2ludGVydmFsID49IHRyZXNoaG9sZF0sIDAuNSkKUTIgPSBxdWFudGlsZShkX2FnZ3IkZXN0X3RpbWVbZF9hZ2dyJHByb2dyZXNzX2ludGVydmFsID49IHRyZXNoaG9sZF0sIDAuOCkKUTMgPSBxdWFudGlsZShkX2FnZ3IkZXN0X3RpbWVbZF9hZ2dyJHByb2dyZXNzX2ludGVydmFsID49IHRyZXNoaG9sZF0sIDAuOSkKCmRfYWdnciAlPiUKICAgICAgICBmaWx0ZXIocHJvZ3Jlc3NfaW50ZXJ2YWwgPj0gdHJlc2hob2xkKSAlPiUKICAgICAgICBtdXRhdGUobWVkaWFuID0gbWVkaWFuKGVzdF90aW1lKSkgJT4lCiAgICAgICAgZ2dwbG90KGFlcyhlc3RfdGltZSkpICsKICAgICAgICAgICAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDIwLCBmaWxsID0gJyMzMzMzQUEnKSArCiAgICAgICAgICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoUTEsIFEyLCBRMyksIGNvbG9yID0gJyNGRjAwMDAnKSArCiAgICAgICAgICAgIGxhYnMoeCA9IHhsYWIsIHkgPSAnQW1vdW50IG9mIHVzZXJzJywgdGl0bGUgPSB0aXRsZSkgKwogICAgICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwLCAxMjAsIDEwKSwgbGltaXRzID0gYygyMCwgMTIwKSkgKwogICAgICAgICAgICB0aGVtZV9jbGFzc2ljKCkKfQoKdGltZV9kaXN0cmlidXRpb24oZF9hZ2dyLCB0aXRsZSA9ICdVc2VycywgbGVhcm5lZCBhdCBsZWFzdCA3MCUnKQpgYGAKUmVkIGxpbmVzIHNob3dzIHF1YW50aWxlcyA1MCUsIDgwJSBhbmQgOTAlLiBTbyA4MCUgb2YgcGVvcGxlIG5lZWQgbGVzcyB0aGFuIDgwIG1pbnV0ZXMgZm9yIG1lbW9yaXppbmcgYWxsIGxldHRlcnMuCjkwJSBuZWVkIGxlc3MgdGhhbiAyIGhvdXJzLiBBbmQgbW9zdCBvZiB0aGUgcmVzdCAxMCUgcHJvYmFibHkgcGVvcGxlLCB3aG8gdG9vayBsb25nIGJyZWFrIGR1cmluZyBwbGF5aW5nLgoKQmVsb3cgaXMgc2FtZSBwbG90LCBidXQgd2l0aCBwZW9wbGUgd2hvIGxlYXJuZWQgYWxsIGxldHRlcnMsIG5vdCBvbmx5IDcwJSsuCmBgYHtyfQpkX2FnZ3IgJT4lCiAgZmlsdGVyKHJlYWNoZWRfZW5kLCBtaW5fbGV0dGVycyA9PSAwKSAlPiUKICB0aW1lX2Rpc3RyaWJ1dGlvbih0aXRsZSA9ICdVc2VycywgbGVhcm5lZCBhbGwgYWxwaGFiZXRpY2FsJywgeGxhYiA9ICdUaW1lIHRvIGxlYXJuIE1vcnNlIGNvZGUnKQpgYGAKCk5vdyBsZXQncyB0YWtlIGFub3RoZXIgbG9vayBhdCBlc3RpbWF0ZWQgdGltZSwgdGhpcyB0aW1lIHdlIHdpbGwgY2hlY2ssIGlzIGl0IGNvcnJlY3QgdG8gZXN0aW1hdGUgdGltZSBieSBzaG9ydGVyIHBlcmlvZHMgb2YgbGVhcm5pbmcuCmBgYHtyIGhvd19tdWNoX3RpbWUgMn0KZF9hZ2dyICU+JQogIGZpbHRlcihwcm9ncmVzc19pbnRlcnZhbCA+PSAxMCwKICAgICAgICAgcHJvZ3Jlc3NfaW50ZXJ2YWwgPD0gMTAwKSAlPiUgICMgUGVvcGxlIHdobyByZWFjaCAxMDAlIGNhbiBwbGF5IG11Y2ggbG9uZ2VyLCAgd2Ugd29uJ3QgY291bnQgdGltZSBhZnRlciB0aGV5IGxlYXJuIGFsbCBsZXR0ZXJzCiAgbXV0YXRlKHByb2dyZXNzX2ludGVydmFsID0gYXMuZmFjdG9yKHJvdW5kKHByb2dyZXNzX2ludGVydmFsLCAtMSkpLAogICAgICAgICBwcm9ncmVzc19pbnRlcnZhbCA9IGZjdF9yZWxldmVsKHByb2dyZXNzX2ludGVydmFsLCBjKCcxMCcsICcyMCcsICczMCcsICc0MCcsICc1MCcsICc2MCcsICc3MCcsICc4MCcsICc5MCcsICcxMDAnKSksCiAgKSAlPiUKICBncm91cF9ieShwcm9ncmVzc19pbnRlcnZhbCkgJT4lCiAgbXV0YXRlKG4gPSBuKCkpICU+JQogICMgc3VtbWFyaXplKG4gPSBuKCksCiAgIyAgICAgICAgICAgbWVkaWFuX3RpbWUgPSBtZWRpYW4oZXN0X3RpbWUpKSU+JQogICMgZmlsdGVyKG4+MikgJT4lCiAgZ2dwbG90KGFlcyh4PXByb2dyZXNzX2ludGVydmFsLCB5PWVzdF90aW1lKSkgKwogICAgZ2VvbV92aW9saW4oZmlsbCA9ICcjODg4OEZGJykgKwogICAgc2NhbGVfeF9kaXNjcmV0ZShicmVha3MgPSBzZXEoMTAsIDEwMCwgMTApKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDEwLCA5MCwgMTApLCBsaW1pdHMgPSBjKDksIDkwKSkgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlKG4sICd1c2VycycpLCB5PTkpLCB2anVzdCA9IC0wLjMsIHNpemUgPSAzLjIpICsKICAgIGxhYnMoeCA9ICclIG9mIGFsaGFiZXRpY2FsIHdhcyBsZWFybmVkIGR1cmluZyB0aGF0IHNlc3Npb24nLAogICAgICAgICB5ID0gJ2VzdGltYXRlZCB0aW1lIChtaW51dGVzKScKICAgICAgICApCmBgYApQZW9wbGUgd2hvIGxlYXJuZWQgbGVzcyB0aGFuIDYwJSBsZXR0ZXJzIGR1cmluZyB0aGF0IHNlc3Npb25zIGZvciBzb21lIHJlYXNvbiBoYXMgdG9vIGhpZ2ggZXN0aW1hdGVkIHNwZWVkLCBzbyB3ZSBzaG91bGQgZXN0aW1hdGUgaXQgYnkKc2Vzc2lvbnMgd2l0aCA2MCUrLiBMb29rcyBsaWtlIGZvciBhdmVyYWdlIHBlb3BsZSBsZWFybmluZyB3aG9sZSBhbHBoYWJldGljYWwgdGFrZXMgfjYwIG1pbnV0ZXMuCgpCZWxvdyBpcyB0aGUgc2FtZSBwbG90LCBidXQgb25seSBmb3IgcGVvcGxlIHdobyBwbGF5ZWQgd2l0aCBzZXR0aW5ncyB3aXRob3V0IGFueSBjbHVlcy4KYGBge3J9CmRfYWdnciAlPiUKICAgICAgICBmaWx0ZXIoc2V0dGluZ3MgPT0gJzAwMScpICU+JQogICAgICAgIGZpbHRlcihwcm9ncmVzc19pbnRlcnZhbCA+PSAxMCwKICAgICAgICAgICAgICAgcHJvZ3Jlc3NfaW50ZXJ2YWwgPCAxMDApICU+JSAgIyBQZW9wbGUgd2hvIHJlYWNoIDEwMCUgY2FuIHBsYXkgbXVjaCBsb25nZXIsICB3ZSB3b24ndCBjb3VudCB0aW1lIGFmdGVyIHRoZXkgbGVhcm4gYWxsIGxldHRlcnMKICAgICAgICBtdXRhdGUocHJvZ3Jlc3NfaW50ZXJ2YWwgPSByb3VuZChwcm9ncmVzc19pbnRlcnZhbCwgLTEpKSAlPiUKICAgICAgICBncm91cF9ieShwcm9ncmVzc19pbnRlcnZhbCkgJT4lCiAgICAgICAgc3VtbWFyaXplKG4gPSBuKCksCiAgICAgICAgICAgICAgICAgIG1lZGlhbl90aW1lID0gbWVkaWFuKGVzdF90aW1lKSklPiUKICAgICAgICBmaWx0ZXIobj4yKSAlPiUKICAgICAgICBnZ3Bsb3QoYWVzKHByb2dyZXNzX2ludGVydmFsLCBtZWRpYW5fdGltZSkpICsKICAgICAgICBnZW9tX2NvbChmaWxsID0gJyMzMzMzQUEnKSArCiAgICAgICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxMCwgMTAwLCAxMCkpICsKICAgICAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDkwLCAxNSkpICsKICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUobiwgJ3VzZXJzJykpLCB2anVzdCA9IC0wLjMsIHNpemUgPSAyLjUpICsKICAgICAgICBsYWJzKHggPSAnJSBvZiBhbGhhYmV0aWNhbCB3YXMgbGVhcm5lZCBkdXJpbmcgdGhhdCBzZXNzaW9uJywKICAgICAgICAgICAgIHkgPSAnbWVkaWFuIGVzdGltYXRlZCB0aW1lIChtaW51dGVzKScKICAgICAgICApCmBgYAojIEhvdyBzcGVlZCBvZiB0aGUgcHJvZ3Jlc3MgY2hhbmdlcyBkdXJpbmcgdGhlIGdhbWU/CgpMZXQncyB0YWtlIHRob3NlIHVzZXJzLCB3aG8gbGVhcm5lZCB3aG9sZSBhbHBoYWJldGljYWxsIGFuZCBzZWUsIGhvdyB0aGVpciBzcGVlZCBjaGFuZ2VkIGR1cmluZyB0aGUgZ2FtZS4KClVuaXRzIGZvciBzcGVlZCBhcmUgYW1vdW50IG9mIGxldHRlcnMsIHdoaWNoIHdvdWxkIGJlIGxlYXJuZWQgaW4gMTAgbWludXRlcyB3aXRoIHRoYXQgc3BlZWQuCmBgYHtyIHNwZWVkX2Rpc3RyaWJ1dGlvbiwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTIwfQpzcGVlZF9wbG90ID0gZCAlPiUKICAgICAgICBncm91cF9ieSh1c2VyKSAlPiUKICAgICAgICBmaWx0ZXIobWF4KHByb2dyZXNzKSAtIG1pbihwcm9ncmVzcykgPj0gOTgsCiAgICAgICAgICAgICAgICFpcy5uYShzcGVlZCkKICAgICAgICApICU+JQogICAgICAgIG11dGF0ZShzcGVlZCA9IHNwZWVkICogMS4wNCAvIDQgKjEwKSAlPiUKICAgICAgICBnZ3Bsb3QoKSArCiAgICAgICAgICAgIGdlb21fbGluZShhZXModG9fbGV0dGVycyhwcm9ncmVzcyksIHNwZWVkKSwgY29sb3I9J2RhcmtibHVlJykgKwogICAgICAgICAgICBnZW9tX3Ntb290aChhZXModG9fbGV0dGVycyhwcm9ncmVzcyksIHNwZWVkKSwgY29sb3I9J3JlZCcsIHNlPUYpICsKICAgICAgICAgICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoMCwgNSwgMTAsIDE1LCAyMCwgMjYpKSArCiAgICAgICAgICAgIGV4cGFuZF9saW1pdHMoeD1jKDAsIDI2KSkgKwogICAgICAgICAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYygwLCA1LCAxMCwgMTUpLCBsaW1pdHMgPSBjKC0zLCAyMCkpICsKICAgICAgICAgICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAnYmxhY2snLCBzaXplPTEpICsKICAgICAgICAgICAgZmFjZXRfd3JhcCh+IHVzZXIsIG5jb2w9NCkgKwogICAgICAgICAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCwgaGp1c3Q9MSwgdmp1c3Q9MC41KSwKICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9saW5lKCdkYXJrZ3JleScsMC43KSkgKwogICAgICAgICAgICB4bGFiKCdMZXR0ZXJzIGxlYXJuZWQnKSArIHlsYWIoJ1NwZWVkIChMZXR0ZXJzIGxlYXJuZWQgcGVyIDEwIG1pbnV0ZXMpJykKcHJpbnQoc3BlZWRfcGxvdCkKYGBgCkF0IGJlZ2lubmluZyBvZiB0aGUgZ2FtZSB3ZSBjYW4gc2VlIGlzIGEgcGVhayBvZiBzcGVlZCwgZm9yIGZpcnN0IGxldHRlcnMsIGJ1dCBhZnRlciB0aGF0IHNwZWVkIGxvb2tzIGNvbnN0YW50IGFuZCB1c3VhbGx5IGFyb3VuZCAzJS4KTWVhbiBzcGVlZCBpcyBgciBtZWFuKGQkc3BlZWQsIG5hLnJtPVQpICU+JSByb3VuZCgxKWAlLgoKRm9yIHNvbWUgdXNlcnMgcHJvZ3Jlc3Mgc2xvd3MgZG93biAoc3BlZWQgaXMgbmVnYXRpdmUpLCBmb3Igb3RoZXJzIGl0cyBuZXZlciBnb2luZyBiYWNrIGFuZCB0aGV5IHNwZWVkIHVwLiAKCiMgV2hpY2ggaGludCBvcHRpb25zIGFyZSBiZXR0ZXIgZm9yIGxlYXJuaW5nPwoKTm93IGxldCdzIGNvbXBhcmUsIGhvdyBtdWNoIHRpbWUgcmVxdWlyZXMgbGVhcm5pbmcgd2l0aCBkaWZmZXJlbnQgaGludCBzZXR0aW5ncy4KYGBge3IgY29tcGFyZV9zZXR0aW5nc30KY29tcGFyZV9zZXR0aW5ncyA9IGZ1bmN0aW9uKGRhdGEpIHsKICBjaGFydF9zZXR0aW5ncyA9IGRhdGEgJT4lCiAgICAgICAgbXV0YXRlKHVzZXJzPWFzLmludGVnZXIoMSkpICU+JQogICAgICAgIGZpbHRlcihwcm9ncmVzc19pbnRlcnZhbCA+IDYwKSAlPiUKICAgICAgICBncm91cF9ieShzZXR0aW5ncykgJT4lCiAgICAgICAgc3VtbWFyaXplKHRpbWUgID0gcm91bmQoMTAwIC8gbWVhbihzcGVlZCkpLAogICAgICAgICAgICAgICAgICB1c2VycyA9IHN1bSh1c2VycyksCiAgICAgICAgICAgICAgICAgIHRvdGFsX3Byb2dyZXNzID0gc3VtKHByb2dyZXNzX2ludGVydmFsKSwKICAgICAgICApICU+JQogICAgICAgIG11dGF0ZSh2aXN1YWxfaGludHMgPSBzdHJfc3ViKHNldHRpbmdzLCAxLCAxKSA9PSAnMScsCiAgICAgICAgICAgICAgIHNwZWVjaF9oaW50cyA9IHN0cl9zdWIoc2V0dGluZ3MsIDIsIDIpID09ICcxJywKICAgICAgICAgICAgICAgc291bmQgPSBzdHJfc3ViKHNldHRpbmdzLCAzLCAzKSA9PSAnMScsCiAgICAgICAgICAgICAgIHRvdGFsX2xldHRlcnMgPSB0b19sZXR0ZXJzKHRvdGFsX3Byb2dyZXNzKQogICAgICAgICAgICAgICkgJT4lCiAgICAgICAgZmlsdGVyKHVzZXJzID4gNSkgJT4lCiAgICAgICAgYXJyYW5nZSh0aW1lKQoKICBjaGFydF9zZXR0aW5ncyAlPiUKICAgICAgICBzZWxlY3QodGltZSwgdmlzdWFsX2hpbnRzLCBzcGVlY2hfaGludHMsIHNvdW5kLCB1c2VycywgdG90YWxfbGV0dGVycykgJT4lCiAgICAgICAgbXV0YXRlX2F0KHZhcnModmlzdWFsX2hpbnRzLCBzcGVlY2hfaGludHMsIHNvdW5kKSwgfiByZXBsYWNlKC4sIHdoaWNoKC4pLCAnKysnKSkgJT4lCiAgICAgICAgbXV0YXRlX2F0KHZhcnModmlzdWFsX2hpbnRzLCBzcGVlY2hfaGludHMsIHNvdW5kKSwgfiByZXBsYWNlKC4sIHdoaWNoKC4gIT0gJysrJyksICfigJMnKSkgJT4lCiAgICAgICAga2FibGUoZm9ybWF0PSdodG1sJywgdGFibGUuYXR0ciA9ICdzdHlsZT0id2lkdGg6NDAlIicsCiAgICAgICAgICAgICAgY29sLm5hbWVzPWMoJ01pbnV0ZXMnLCAnVmlzdWFsIGhpbnRzJywgJ1NwZWVjaCBoaW50cycsICdTb3VuZCBlbmFibGVkJywgJ1VzZXJzJywgJ1RvdGFsIGxldGVycycpLAogICAgICAgICAgICAgIGFsaWduID0gJ2MnCiAgICAgICAgKSAlPiUKICAgICAgICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygnc3RyaXBlZCcsICdob3ZlcicpKQp9Cgpjb21wYXJlX3NldHRpbmdzKGRfYWdncikKYGBgCldpdGggb3VyIGN1cnJlbnQgYW1vdW50IG9mIGRhdGEgd2UgY2FuJ3QgbWFrZSByZWxpYWJsZSBjb25sdXNpb25zIGFib3V0IHdoaWNoIGNsdWUgc2V0dGluZ3MgYXJlIG1vcmUgZWZmZWN0aXZlLgoKVGhpcyBpcyBzYW1lIHRhYmxlLCBidXQgb25seSBmb3IgdXNlcnMgd2hvIGxlYXJuZWQgYWxsIGFscGhhYmV0aWNhbCB3aXRob3V0IGNoYW5naW5nIHNldHRpbmdzOgpgYGB7cn0KZF9hZ2dyICU+JQogICAgICAgIGZpbHRlcihyZWFjaGVkX2VuZCwgbWluX3Byb2dyZXNzIDw9IDApICU+JQogICAgICAgIGNvbXBhcmVfc2V0dGluZ3MoKQpgYGAKCuKAkyDigJMg4oCTIOKAkyDigJMg4oCTIOKAkyDigJMg4oCTIOKAkyDigJMg4oCTIOKAkyDigJMKCkJlbG93IGlzIHRoZSBvbGRlciBzZWN0aW9uLCB3aGljaCBpcyBwcm92ZWQgdG8gYmUgd3JvbmcgYWZ0ZXIgd2UgZGlkIGZpbmQgb3V0IHRoYXQgc3BlZWQgb2YgdXNlcnMgd2l0aCB0b28gc2hvcnQgc2Vzc2lvbiAobGVzcyB0aGFuIDcwJSkgZXN0aW1hdGVkIHRvbyBoaWdoLgpTZXNzaW9ucyB3aXRob3V0IGFueSBjbHVlcyB3cmUgc2hvcnRlciwgdGhhdCdzIHdoeSB3ZSBlc3RpbWF0ZWQgdGhlaXIgc3BlZWQgaGlnaGVyLgoKTm93IGxldCdzIGNvbXBhcmUsIGhvdyBtdWNoIHRpbWUgcmVxdWlyZXMgbGVhcm5pbmcgd2l0aCBkaWZmZXJlbnQgaGludCBzZXR0aW5ncy4KQXQgZmlyc3QgbG9vayBpdHMgbGlrZSB0aGlzOgpgYGB7ciBjb21wYXJlX3NldHRpbmdzX29sZH0KY2hhcnRfc2V0dGluZ3MgPSBkX2FnZ3IgJT4lCiAgICAgICAgbXV0YXRlKHVzZXJzPWFzLmludGVnZXIoMSkpICU+JQogICAgICAgIGZpbHRlcihwcm9ncmVzc19pbnRlcnZhbCA+IDEwKSAlPiUKICAgICAgICBncm91cF9ieShzZXR0aW5ncykgJT4lCiAgICAgICAgc3VtbWFyaXplKHRpbWUgID0gcm91bmQoMTAwIC8gbWVhbihzcGVlZCkpLAogICAgICAgICAgICAgICAgICB1c2VycyA9IHN1bSh1c2VycyksCiAgICAgICAgICAgICAgICAgIHRvdGFsX3Byb2dyZXNzID0gc3VtKHByb2dyZXNzX2ludGVydmFsKSwKICAgICAgICApICU+JQogICAgICAgIG11dGF0ZSh2aXN1YWxfaGludHMgPSBzdHJfc3ViKHNldHRpbmdzLCAxLCAxKSA9PSAnMScsCiAgICAgICAgICAgICAgIHNwZWVjaF9oaW50cyA9IHN0cl9zdWIoc2V0dGluZ3MsIDIsIDIpID09ICcxJywKICAgICAgICAgICAgICAgc291bmQgPSBzdHJfc3ViKHNldHRpbmdzLCAzLCAzKSA9PSAnMScsCiAgICAgICAgICAgICAgIHRvdGFsX2xldHRlcnMgPSByb3VuZCh0b3RhbF9wcm9ncmVzcyAvIDEwMCAqIDI2KQogICAgICAgICAgICAgICkgJT4lCiAgICAgICAgZmlsdGVyKHVzZXJzID4gNSkgJT4lCiAgICAgICAgYXJyYW5nZSh0aW1lKQoKY2hhcnRfc2V0dGluZ3MgJT4lCiAgICAgICAgc2VsZWN0KHRpbWUsIHZpc3VhbF9oaW50cywgc3BlZWNoX2hpbnRzLCBzb3VuZCwgdXNlcnMsIHRvdGFsX2xldHRlcnMpICU+JQogICAgICAgIG11dGF0ZV9hdCh2YXJzKHZpc3VhbF9oaW50cywgc3BlZWNoX2hpbnRzLCBzb3VuZCksIH4gcmVwbGFjZSguLCB3aGljaCguKSwgJysrJykpICU+JQogICAgICAgIG11dGF0ZV9hdCh2YXJzKHZpc3VhbF9oaW50cywgc3BlZWNoX2hpbnRzLCBzb3VuZCksIH4gcmVwbGFjZSguLCB3aGljaCguICE9ICcrKycpLCAn4oCTJykpICU+JQogICAgICAgIGthYmxlKGZvcm1hdD0naHRtbCcsIHRhYmxlLmF0dHIgPSAnc3R5bGU9IndpZHRoOjQwJSInLAogICAgICAgICAgICAgIGNvbC5uYW1lcz1jKCdNaW51dGVzJywgJ1Zpc3VhbCBoaW50cycsICdTcGVlY2ggaGludHMnLCAnU291bmQgZW5hYmxlZCcsICdVc2VycycsICdUb3RhbCBsZXRlcnMnKSwKICAgICAgICAgICAgICBhbGlnbiA9ICdjJwogICAgICAgICkgJT4lCiAgICAgICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoJ3N0cmlwZWQnLCAnaG92ZXInKSkKYGBgCkFjY29yZGluZyB0byB0aGlzIHRhYmxlLCB0aGUgYmVzdCBvcHRpb24gaXMgdG8gcGxheSBvbmx5IHdpdGggc291bmQgYW5kIHdpdGhvdXQgaGludHMuCkJ1dCB3ZSBtdXN0IGNoZWNrLCBob3cgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCB0aG9zZSBkaWZmZXJlbmNlcyBhcmUuCgpgYGB7ciByZXN1bHRzID0gJ2hpZGUnfQpkX3Rlc3QgPSBkX2FnZ3IgJT4lIGZpbHRlcihwcm9ncmVzc19pbnRlcnZhbCA+IDEwKQp0ZXN0XzAwMSA9IGRfdGVzdCAlPiUgZmlsdGVyKHNldHRpbmdzID09ICcwMDEnKQp0ZXN0XzEwMCA9IGRfdGVzdCAlPiUgZmlsdGVyKHNldHRpbmdzID09ICcxMDAnKQp0ZXN0XzEwMSA9IGRfdGVzdCAlPiUgZmlsdGVyKHNldHRpbmdzID09ICcxMDEnKQp0ZXN0XzExMCA9IGRfdGVzdCAlPiUgZmlsdGVyKHNldHRpbmdzID09ICcxMTAnKQp0ZXN0XzExMSA9IGRfdGVzdCAlPiUgZmlsdGVyKHNldHRpbmdzID09ICcxMTEnKQp0ZXN0XzAxMCA9IGRfdGVzdCAlPiUgZmlsdGVyKHNldHRpbmdzID09ICcwMTAnKQp0ZXN0XzAxMSA9IGRfdGVzdCAlPiUgZmlsdGVyKHNldHRpbmdzID09ICcwMTEnKQoKdGVzdF92aXN1YWxfb2ZmID0gZF90ZXN0ICU+JSBmaWx0ZXIoc2V0dGluZ3MgJWluJSBjKCcwMTEnLCAnMDAxJykpCnQudGVzdCh0ZXN0X3Zpc3VhbF9vZmYkc3BlZWQsIHRlc3RfMTAwJHNwZWVkKQp0LnRlc3QodGVzdF8xMDEkc3BlZWQsIHRlc3RfMTAwJHNwZWVkKQoKIyBWaXN1YWwgaGludHMKdC50ZXN0KHRlc3RfMTAxJHNwZWVkLCB0ZXN0XzAwMSRzcGVlZCkKdC50ZXN0KHRlc3RfMTExJHNwZWVkLCB0ZXN0XzAxMSRzcGVlZCkKCiMgU3BlZWNoIGhpbnRzCnQudGVzdCh0ZXN0XzExMSRzcGVlZCwgdGVzdF8xMDEkc3BlZWQpCnQudGVzdCh0ZXN0XzExMCRzcGVlZCwgdGVzdF8xMDAkc3BlZWQpCnQudGVzdCh0ZXN0XzAxMSRzcGVlZCwgdGVzdF8wMDEkc3BlZWQpCgojIFNvdW5kCnQudGVzdCh0ZXN0XzEwMSRzcGVlZCwgdGVzdF8xMDAkc3BlZWQpCnQudGVzdCh0ZXN0XzExMSRzcGVlZCwgdGVzdF8xMTAkc3BlZWQpCmBgYApXaXRoIG91ciBjdXJyZW50IGFtb3VudCBvZiBkYXRhIHdlIGNhbid0IG1ha2UgcmVsaWFibGUgY29ubHVzaW9ucyBhYm91dCB3aGljaCBjbHVlIHNldHRpbmdzIGFyZSBtb3JlIGVmZmVjdGl2ZS4KCkluIG9yZGVyIHRvIGF2b2lkIG1pc2ludGVycHJldGF0aW9ucywgSSB3aWxsIHRyeSB0byBwdXQgbXkgd29yZHMgdmVyeSBwcmVjaXNlbHkgaW4gdGhpcyBwYXJ0LiBNaWdodCBiZSBhIGJpdCByZXBldGl0aXZlLgoKQWZ0ZXIgc2VyaWVzIG9mIFQtdGVzdHMsIGFjY29yZGluZyB0byBvdXIgZGF0YSwgd2UgY2FuIG1ha2UgdGhvc2Ugc3RhdGVtZW50cywgd2hpY2ggYXJlIHRvdGFsbHkgaW5kZXBlbmRlbnQgb2YgZWFjaCBvdGhlcjoKCioqKgoKIyMjIyBWaXN1YWwgaGludHMKLSBXaGVuIHNvdW5kIGlzIGVuYWJsZWQsIGJ1dCBzcGVlY2ggaGludHMgYXJlbid0LCB3ZSBjYW4gYmUgc3VyZSB3aXRoCioqYHIgKDEwMCAtIHQudGVzdCh0ZXN0XzEwMSRzcGVlZCwgdGVzdF8wMDEkc3BlZWQpJHAudmFsdWUgKiAxMDApICU+JSByb3VuZCgpYCUgKioKY2VydGFpbnR5LCB0aGF0IGRpc2FibGluZyB2aXN1YWwgaGludHMgd2lsbCB1c3VhbGx5IHNwZWVkIHVwIGxlYXJuaW5nIHByb2Nlc3MuCi0gV2hlbiBzb3VuZCBhbmQgc3BlZWNoIGhpbnRzIGFyZSBlbmFibGVkLCB3ZSBjYW4gYmUgc3VyZSB3aXRoIGF0IGxlYXN0CioqYHIgKDEwMCAtIHQudGVzdCh0ZXN0XzExMSRzcGVlZCwgdGVzdF8wMTEkc3BlZWQpJHAudmFsdWUgKiAxMDApICU+JSByb3VuZCgpYCUgKioKY2VydGFpbnR5LCB0aGF0IGRpc2FibGluZyB2aXN1YWwgaGludHMgd2lsbCB1c3VhbGx5IHNwZWVkIHVwIGxlYXJuaW5nIHByb2Nlc3MuCgojIyMjIFNwZWVjaCBoaW50cwotIFdoZW4gc291bmQgYW5kIHZpc3VhbCBoaW50cyBhcmUgZW5hYmxlZCwgdGhlcmUgaXMgbm8gc2lnbmlmaWNhbmNlIGVub3VnaCBkaWZmZXJlbmNlCmJldHdlZW4gZW5hYmxpbmcgYW5kIGRpc2FibGluZyBzcGVlY2ggaGludHMuIFByb2JhYmx5IHRoZXJlIGlzIHNvbWUgc21hbGwgZGlmZmVyZW5jZSwKYnV0IHdpdGggb3VyIGN1cnJlbnQgYW1vdW50IG9mIGRhdGEgd2UgY2FuJ3QgY2F0Y2ggc28gc21hbGwgZGlmZmVyZW5jZXMuCi0gV2hlbiB2aXN1YWwgaGludHMgYXJlIGVuYWJsZWQsIGJ1dCBzb3VuZCBpc24ndCwgd2UgY2FuIGJlIHN1cmUgd2l0aCBhdCBsZWFzdAoqKmByICgxMDAgLSB0LnRlc3QodGVzdF8xMTAkc3BlZWQsIHRlc3RfMTAwJHNwZWVkKSRwLnZhbHVlICogMTAwKSAlPiUgcm91bmQoKWAlICoqCmNlcnRhaW50eSwgdGhhdCBkaXNhYmxpbmcgc3BlZWNoIGhpbnRzIHdpbGwgdXN1YWxseSBzcGVlZCB1cCBsZWFybmluZyBwcm9jZXNzLgoKIyMjIyBTb3VuZAotIFdoZW4gdmlzdWFsIGhpbnRzIGFyZSBlbmFibGVkLCBidXQgc3BlZWNoIGhpbnRzIGFyZW4ndCwgd2UgY2FuIGJlIHN1cmUgd2l0aCBhdCBsZWFzdAoqKmByICgxMDAgLSB0LnRlc3QodGVzdF8xMDEkc3BlZWQsIHRlc3RfMTAwJHNwZWVkKSRwLnZhbHVlICogMTAwKSAlPiUgcm91bmQoKWAlICoqCmNlcnRhaW50eSwgdGhhdCBkaXNhYmxpbmcgc291bmQgd2lsbCB1c3VhbGx5IHNwZWVkIHVwIGxlYXJuaW5nIHByb2Nlc3MuCmBgYHtyIHJlc3VsdHMgPSAnaGlkZSd9CmRfdGVzdCA9IGRfYWdnciAlPiUgZmlsdGVyKHByb2dyZXNzX2ludGVydmFsID4gMTApCnRlc3RfMDAxID0gZF90ZXN0ICU+JSBmaWx0ZXIoc2V0dGluZ3MgPT0gJzAwMScpCnRlc3RfMTAwID0gZF90ZXN0ICU+JSBmaWx0ZXIoc2V0dGluZ3MgPT0gJzEwMCcpCnRlc3RfMTAxID0gZF90ZXN0ICU+JSBmaWx0ZXIoc2V0dGluZ3MgPT0gJzEwMScpCnRlc3RfMTEwID0gZF90ZXN0ICU+JSBmaWx0ZXIoc2V0dGluZ3MgPT0gJzExMCcpCnRlc3RfMTExID0gZF90ZXN0ICU+JSBmaWx0ZXIoc2V0dGluZ3MgPT0gJzExMScpCnRlc3RfMDEwID0gZF90ZXN0ICU+JSBmaWx0ZXIoc2V0dGluZ3MgPT0gJzAxMCcpCnRlc3RfMDExID0gZF90ZXN0ICU+JSBmaWx0ZXIoc2V0dGluZ3MgPT0gJzAxMScpCgp0ZXN0X3Zpc3VhbF9vZmYgPSBkX3Rlc3QgJT4lIGZpbHRlcihzZXR0aW5ncyAlaW4lIGMoJzAxMScsICcwMDEnKSkKdC50ZXN0KHRlc3RfdmlzdWFsX29mZiRzcGVlZCwgdGVzdF8xMDAkc3BlZWQpCnQudGVzdCh0ZXN0XzEwMSRzcGVlZCwgdGVzdF8xMDAkc3BlZWQpCgojIFZpc3VhbCBoaW50cwp0LnRlc3QodGVzdF8xMDEkc3BlZWQsIHRlc3RfMDAxJHNwZWVkKQp0LnRlc3QodGVzdF8xMTEkc3BlZWQsIHRlc3RfMDExJHNwZWVkKQoKIyBTcGVlY2ggaGludHMKdC50ZXN0KHRlc3RfMTExJHNwZWVkLCB0ZXN0XzEwMSRzcGVlZCkKdC50ZXN0KHRlc3RfMTEwJHNwZWVkLCB0ZXN0XzEwMCRzcGVlZCkKdC50ZXN0KHRlc3RfMDExJHNwZWVkLCB0ZXN0XzAwMSRzcGVlZCkKCiMgU291bmQKdC50ZXN0KHRlc3RfMTAxJHNwZWVkLCB0ZXN0XzEwMCRzcGVlZCkKdC50ZXN0KHRlc3RfMTExJHNwZWVkLCB0ZXN0XzExMCRzcGVlZCkKYGBgCgojIyBBY2N1cmFjeSBmb3IgZWFjaCBsZXR0ZXIKCldlIHRvb2sgYWNjdXJhY3kgc3RhdHMgZnJvbSBlYWNoIHVzZXIgb25seSB1bnRpbCB0aGV5IGdvdCAxMCBzdWNjZXNzIHRyaWFscyBmb3IgdGhpcyBsZXR0ZXIuCkNvbHVtbiAiVmlzdWFsKyIgc2hvd3MgYW1vdW50IG9mIGNvcnJlY3QgaW5wdXRzLCB3aGlsZSB2aXN1YWwgaGludHMgd2VyZSBzaG93bi4KIlZpc3VhbC0iIHNob3dzIG1pc3Rha2VzIGFuZCAiVmlzdWFsJSIgc2hvd3MgcGVyY2VudCBvZiBtaXN0YWtlcy4KCkxldHRlcnMgd2l0aCB0b28gaW5zaWduaWZpY2FudCBhbW91bnQgb2YgZGF0YSBub3Qgc2hvd24uCgpgYGB7ciBhY2N1cmFjeV9mb3JfbGV0dGVyc30KaWYoY2FsY3VsYXRlX2FjY3VyYWN5KSB7CmFjY3VyYWN5ICU+JQogIGZpbHRlcihgdmlzdWFsK2AgPiA3MCkgJT4lCiAgYXJyYW5nZShkZXNjKGB2aXN1YWwlYCkpICU+JQogIG11dGF0ZSgndmlzdWFsJScgPSBwYXN0ZTAocm91bmQoYHZpc3VhbCVgKjEwMCksICclJyksCiAgJ3NwZWVjaCUnID0gcGFzdGUwKHJvdW5kKGBzcGVlY2glYCoxMDApLCAnJScpLAogICdub2hpbnRzJScgPSBwYXN0ZTAocm91bmQoYG5vaGludHMlYCoxMDApLCAnJScpKSAlPiUKICBrYWJsZShmb3JtYXQ9J2h0bWwnLCB0YWJsZS5hdHRyID0gJ3N0eWxlPSJ3aWR0aDo0MCUiJykgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoJ3N0cmlwZWQnLCAnaG92ZXInKSkgJT4lCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUpCn0KYGBgCkxvb2tzIGxpa2Ugc29tZSB2aXN1YWwgaGludHMgbWFrZXMgaXQgdmVyeSBoYXJkIHRvIGxlYXJuIGxldHRlciDigJQgQiwgSCwgUiwgSywgRS4KCiJGIiBtaWdodCBiZSBqdXN0IGEgaGFyZCBsZXR0ZXIuCgpTb21lIHZpc3VhbCBoaW50cyBwcm9iYWJseSBtYWtlcyBpdCBlYXNpZXIsIGZvciBleGFtcGxlIEwgYW5kIFUuCgpCdXQgZm9yIG1vc3QgbGV0dGVycyBhY2N1cmFjeSBpcyBiZXR0ZXIgd2l0aG91dCBhbnkgY2x1ZXMuCgpTcGVlY2ggY2x1ZSBhcmVuJ3QgYWZmZWN0IGxlYXJuaW5nIHByb2Nlc3MgdGhhdCBtdWNoIGFzIHZpc3VhbCDigJQgYWNjdXJhY3kgZm9yIHRoZW0gaXMgbW9yZSBzaW1pbGFyIHdpdGggIm5vIGhpbnRzIiBvcHRpb24uCg==