@altnovatrail/contracts 0.7.7 → 0.7.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,737 @@
1
+ {
2
+ "description": "The rule of the groups of strokes (contracts/README.md, section 12): from a history of writing to the strokes the sheet shows at the end, the pairs of them that are neighbours, their groups by place, the box of each group's points in tenths, and the groups of each stroke written and taken off. The cases but the last five are canvas's vectors/groups.json at its tag v0.1.2, each history as a sample writes it: times in whole milliseconds and no pressure.",
3
+ "rule": {"pause": 2000, "across": 50, "down": 50},
4
+ "cases": [
5
+ {
6
+ "name": "staircase",
7
+ "description": "The example of canvas's research into a child's writing and the AI tutor: a ladder of two posts and seven rungs, «30» beside it after a pause, «180 : 30 = 5» after another, the 5 erased, then 6, ringed.",
8
+ "history": {"events": [
9
+ {"t_ms": 800, "write": {"id": 1, "pointer": "pen", "points": [{"x": 100, "y": 300, "t_ms": 0}, {"x": 100, "y": 600, "t_ms": 800}]}},
10
+ {"t_ms": 1850, "write": {"id": 2, "pointer": "pen", "points": [{"x": 160, "y": 300, "t_ms": 1050}, {"x": 160, "y": 600, "t_ms": 1850}]}},
11
+ {"t_ms": 2260, "write": {"id": 3, "pointer": "pen", "points": [{"x": 100, "y": 600, "t_ms": 2100}, {"x": 160, "y": 600, "t_ms": 2260}]}},
12
+ {"t_ms": 2670, "write": {"id": 4, "pointer": "pen", "points": [{"x": 100, "y": 550, "t_ms": 2510}, {"x": 160, "y": 550, "t_ms": 2670}]}},
13
+ {"t_ms": 3080, "write": {"id": 5, "pointer": "pen", "points": [{"x": 100, "y": 500, "t_ms": 2920}, {"x": 160, "y": 500, "t_ms": 3080}]}},
14
+ {"t_ms": 3490, "write": {"id": 6, "pointer": "pen", "points": [{"x": 100, "y": 450, "t_ms": 3330}, {"x": 160, "y": 450, "t_ms": 3490}]}},
15
+ {"t_ms": 3900, "write": {"id": 7, "pointer": "pen", "points": [{"x": 100, "y": 400, "t_ms": 3740}, {"x": 160, "y": 400, "t_ms": 3900}]}},
16
+ {"t_ms": 4310, "write": {"id": 8, "pointer": "pen", "points": [{"x": 100, "y": 350, "t_ms": 4150}, {"x": 160, "y": 350, "t_ms": 4310}]}},
17
+ {"t_ms": 4720, "write": {"id": 9, "pointer": "pen", "points": [{"x": 100, "y": 300, "t_ms": 4560}, {"x": 160, "y": 300, "t_ms": 4720}]}},
18
+ {"t_ms": 7920, "write": {"id": 10, "pointer": "pen", "points": [{"x": 175, "y": 413.6, "t_ms": 7720}, {"x": 183, "y": 410, "t_ms": 7744}, {"x": 191, "y": 413.6, "t_ms": 7768}, {"x": 193, "y": 420.8, "t_ms": 7792}, {"x": 185, "y": 428, "t_ms": 7816}, {"x": 193, "y": 435.2, "t_ms": 7840}, {"x": 193, "y": 442.4, "t_ms": 7864}, {"x": 185, "y": 446, "t_ms": 7888}, {"x": 175, "y": 442.4, "t_ms": 7920}]}},
19
+ {"t_ms": 8410, "write": {"id": 11, "pointer": "pen", "points": [{"x": 211, "y": 410, "t_ms": 8170}, {"x": 217, "y": 413.6, "t_ms": 8186}, {"x": 221, "y": 424.4, "t_ms": 8218}, {"x": 221, "y": 431.6, "t_ms": 8242}, {"x": 217, "y": 442.4, "t_ms": 8274}, {"x": 211, "y": 446, "t_ms": 8290}, {"x": 205, "y": 442.4, "t_ms": 8306}, {"x": 201, "y": 431.6, "t_ms": 8338}, {"x": 201, "y": 424.4, "t_ms": 8362}, {"x": 205, "y": 413.6, "t_ms": 8394}, {"x": 211, "y": 410, "t_ms": 8410}]}},
20
+ {"t_ms": 11538, "write": {"id": 12, "pointer": "pen", "points": [{"x": 264, "y": 440.8, "t_ms": 11410}, {"x": 272, "y": 430, "t_ms": 11442}, {"x": 272, "y": 466, "t_ms": 11538}]}},
21
+ {"t_ms": 12108, "write": {"id": 13, "pointer": "pen", "points": [{"x": 296, "y": 448, "t_ms": 11788}, {"x": 288, "y": 440.8, "t_ms": 11812}, {"x": 290, "y": 430, "t_ms": 11844}, {"x": 302, "y": 430, "t_ms": 11876}, {"x": 304, "y": 440.8, "t_ms": 11908}, {"x": 296, "y": 448, "t_ms": 11932}, {"x": 286, "y": 455.2, "t_ms": 11964}, {"x": 288, "y": 466, "t_ms": 11996}, {"x": 304, "y": 466, "t_ms": 12044}, {"x": 306, "y": 455.2, "t_ms": 12076}, {"x": 296, "y": 448, "t_ms": 12108}]}},
22
+ {"t_ms": 12598, "write": {"id": 14, "pointer": "pen", "points": [{"x": 322, "y": 430, "t_ms": 12358}, {"x": 328, "y": 433.6, "t_ms": 12374}, {"x": 332, "y": 444.4, "t_ms": 12406}, {"x": 332, "y": 451.6, "t_ms": 12430}, {"x": 328, "y": 462.4, "t_ms": 12462}, {"x": 322, "y": 466, "t_ms": 12478}, {"x": 316, "y": 462.4, "t_ms": 12494}, {"x": 312, "y": 451.6, "t_ms": 12526}, {"x": 312, "y": 444.4, "t_ms": 12550}, {"x": 316, "y": 433.6, "t_ms": 12582}, {"x": 322, "y": 430, "t_ms": 12598}]}},
23
+ {"t_ms": 13128, "write": {"id": 15, "pointer": "pen", "points": [{"x": 374, "y": 440.8, "t_ms": 13098}, {"x": 374, "y": 440.8, "t_ms": 13128}]}},
24
+ {"t_ms": 13308, "write": {"id": 16, "pointer": "pen", "points": [{"x": 374, "y": 455.2, "t_ms": 13278}, {"x": 374, "y": 455.2, "t_ms": 13308}]}},
25
+ {"t_ms": 14008, "write": {"id": 17, "pointer": "pen", "points": [{"x": 416, "y": 433.6, "t_ms": 13808}, {"x": 424, "y": 430, "t_ms": 13832}, {"x": 432, "y": 433.6, "t_ms": 13856}, {"x": 434, "y": 440.8, "t_ms": 13880}, {"x": 426, "y": 448, "t_ms": 13904}, {"x": 434, "y": 455.2, "t_ms": 13928}, {"x": 434, "y": 462.4, "t_ms": 13952}, {"x": 426, "y": 466, "t_ms": 13976}, {"x": 416, "y": 462.4, "t_ms": 14008}]}},
26
+ {"t_ms": 14498, "write": {"id": 18, "pointer": "pen", "points": [{"x": 452, "y": 430, "t_ms": 14258}, {"x": 458, "y": 433.6, "t_ms": 14274}, {"x": 462, "y": 444.4, "t_ms": 14306}, {"x": 462, "y": 451.6, "t_ms": 14330}, {"x": 458, "y": 462.4, "t_ms": 14362}, {"x": 452, "y": 466, "t_ms": 14378}, {"x": 446, "y": 462.4, "t_ms": 14394}, {"x": 442, "y": 451.6, "t_ms": 14426}, {"x": 442, "y": 444.4, "t_ms": 14450}, {"x": 446, "y": 433.6, "t_ms": 14482}, {"x": 452, "y": 430, "t_ms": 14498}]}},
27
+ {"t_ms": 15046, "write": {"id": 19, "pointer": "pen", "points": [{"x": 496, "y": 440.8, "t_ms": 14998}, {"x": 512, "y": 440.8, "t_ms": 15046}]}},
28
+ {"t_ms": 15244, "write": {"id": 20, "pointer": "pen", "points": [{"x": 496, "y": 455.2, "t_ms": 15196}, {"x": 512, "y": 455.2, "t_ms": 15244}]}},
29
+ {"t_ms": 15920, "write": {"id": 21, "pointer": "pen", "points": [{"x": 548, "y": 430, "t_ms": 15744}, {"x": 548, "y": 444.4, "t_ms": 15784}, {"x": 558, "y": 444.4, "t_ms": 15816}, {"x": 564, "y": 451.6, "t_ms": 15840}, {"x": 564, "y": 458.8, "t_ms": 15864}, {"x": 558, "y": 466, "t_ms": 15888}, {"x": 546, "y": 462.4, "t_ms": 15920}]}},
30
+ {"t_ms": 16118, "write": {"id": 22, "pointer": "pen", "points": [{"x": 548, "y": 430, "t_ms": 16070}, {"x": 564, "y": 430, "t_ms": 16118}]}},
31
+ {"t_ms": 17818, "erase": {"ids": [21, 22]}},
32
+ {"t_ms": 19542, "write": {"id": 23, "pointer": "pen", "points": [{"x": 562, "y": 430, "t_ms": 19318}, {"x": 552, "y": 437.2, "t_ms": 19350}, {"x": 546, "y": 451.6, "t_ms": 19390}, {"x": 548, "y": 462.4, "t_ms": 19422}, {"x": 556, "y": 466, "t_ms": 19446}, {"x": 564, "y": 458.8, "t_ms": 19470}, {"x": 564, "y": 451.6, "t_ms": 19494}, {"x": 556, "y": 448, "t_ms": 19518}, {"x": 548, "y": 451.6, "t_ms": 19542}]}},
33
+ {"t_ms": 20326, "write": {"id": 24, "pointer": "pen", "points": [{"x": 556, "y": 420, "t_ms": 19942}, {"x": 566.8, "y": 425.6, "t_ms": 19974}, {"x": 574, "y": 442.4, "t_ms": 20022}, {"x": 574, "y": 453.6, "t_ms": 20054}, {"x": 566.8, "y": 470.4, "t_ms": 20102}, {"x": 556, "y": 476, "t_ms": 20134}, {"x": 545.2, "y": 470.4, "t_ms": 20166}, {"x": 538, "y": 453.6, "t_ms": 20214}, {"x": 538, "y": 442.4, "t_ms": 20246}, {"x": 545.2, "y": 425.6, "t_ms": 20294}, {"x": 556, "y": 420, "t_ms": 20326}]}}
34
+ ]},
35
+ "visible": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 23, 24],
36
+ "neighbours": [
37
+ [1, 3],
38
+ [1, 4],
39
+ [2, 3],
40
+ [2, 4],
41
+ [2, 5],
42
+ [2, 6],
43
+ [2, 7],
44
+ [3, 4],
45
+ [4, 5],
46
+ [5, 6],
47
+ [6, 7],
48
+ [7, 8],
49
+ [8, 9],
50
+ [10, 11],
51
+ [12, 13],
52
+ [12, 14],
53
+ [13, 14],
54
+ [14, 15],
55
+ [14, 16],
56
+ [15, 16],
57
+ [15, 17],
58
+ [16, 17],
59
+ [17, 18],
60
+ [18, 19],
61
+ [18, 20],
62
+ [19, 20],
63
+ [23, 24]
64
+ ],
65
+ "groups": [
66
+ {"label": "A", "stroke_ids": [1, 2, 3, 4, 5, 6, 7, 8, 9]},
67
+ {"label": "B", "stroke_ids": [10, 11]},
68
+ {"label": "C", "stroke_ids": [23, 24]},
69
+ {"label": "D", "stroke_ids": [12, 13, 14, 15, 16, 17, 18, 19, 20]}
70
+ ],
71
+ "group_boxes": [
72
+ {"ymin": 3000, "xmin": 1000, "ymax": 6000, "xmax": 1600},
73
+ {"ymin": 4100, "xmin": 1750, "ymax": 4460, "xmax": 2210},
74
+ {"ymin": 4200, "xmin": 5380, "ymax": 4760, "xmax": 5740},
75
+ {"ymin": 4300, "xmin": 2640, "ymax": 4660, "xmax": 5120}
76
+ ],
77
+ "erased": [
78
+ {"stroke_id": 21, "labels": ["D"]},
79
+ {"stroke_id": 22, "labels": ["D"]}
80
+ ]
81
+ },
82
+ {
83
+ "name": "later",
84
+ "description": "«12 + 5 =», and 8 s later «17» right after it: what is written later next to old writing is a group of its own (R06 canvas).",
85
+ "history": {"events": [
86
+ {"t_ms": 128, "write": {"id": 1, "pointer": "pen", "points": [{"x": 104, "y": 210.8, "t_ms": 0}, {"x": 112, "y": 200, "t_ms": 32}, {"x": 112, "y": 236, "t_ms": 128}]}},
87
+ {"t_ms": 586, "write": {"id": 2, "pointer": "pen", "points": [{"x": 126, "y": 207.2, "t_ms": 378}, {"x": 132, "y": 200, "t_ms": 402}, {"x": 140, "y": 200, "t_ms": 426}, {"x": 146, "y": 210.8, "t_ms": 458}, {"x": 144, "y": 218, "t_ms": 482}, {"x": 126, "y": 236, "t_ms": 530}, {"x": 146, "y": 236, "t_ms": 586}]}},
88
+ {"t_ms": 1150, "write": {"id": 3, "pointer": "pen", "points": [{"x": 188, "y": 207.2, "t_ms": 1086}, {"x": 188, "y": 228.8, "t_ms": 1150}]}},
89
+ {"t_ms": 1332, "write": {"id": 4, "pointer": "pen", "points": [{"x": 182, "y": 218, "t_ms": 1300}, {"x": 194, "y": 218, "t_ms": 1332}]}},
90
+ {"t_ms": 2008, "write": {"id": 5, "pointer": "pen", "points": [{"x": 232, "y": 200, "t_ms": 1832}, {"x": 232, "y": 214.4, "t_ms": 1872}, {"x": 242, "y": 214.4, "t_ms": 1904}, {"x": 248, "y": 221.6, "t_ms": 1928}, {"x": 248, "y": 228.8, "t_ms": 1952}, {"x": 242, "y": 236, "t_ms": 1976}, {"x": 230, "y": 232.4, "t_ms": 2008}]}},
91
+ {"t_ms": 2206, "write": {"id": 6, "pointer": "pen", "points": [{"x": 232, "y": 200, "t_ms": 2158}, {"x": 248, "y": 200, "t_ms": 2206}]}},
92
+ {"t_ms": 2754, "write": {"id": 7, "pointer": "pen", "points": [{"x": 284, "y": 210.8, "t_ms": 2706}, {"x": 300, "y": 210.8, "t_ms": 2754}]}},
93
+ {"t_ms": 2952, "write": {"id": 8, "pointer": "pen", "points": [{"x": 284, "y": 225.2, "t_ms": 2904}, {"x": 300, "y": 225.2, "t_ms": 2952}]}},
94
+ {"t_ms": 11080, "write": {"id": 9, "pointer": "pen", "points": [{"x": 338, "y": 210.8, "t_ms": 10952}, {"x": 346, "y": 200, "t_ms": 10984}, {"x": 346, "y": 236, "t_ms": 11080}]}},
95
+ {"t_ms": 11482, "write": {"id": 10, "pointer": "pen", "points": [{"x": 360, "y": 200, "t_ms": 11330}, {"x": 380, "y": 200, "t_ms": 11386}, {"x": 368, "y": 236, "t_ms": 11482}]}}
96
+ ]},
97
+ "visible": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
98
+ "neighbours": [
99
+ [1, 2],
100
+ [2, 3],
101
+ [2, 4],
102
+ [3, 4],
103
+ [3, 5],
104
+ [3, 6],
105
+ [4, 5],
106
+ [4, 6],
107
+ [5, 6],
108
+ [5, 7],
109
+ [5, 8],
110
+ [6, 7],
111
+ [6, 8],
112
+ [7, 8],
113
+ [9, 10]
114
+ ],
115
+ "groups": [
116
+ {"label": "A", "stroke_ids": [1, 2, 3, 4, 5, 6, 7, 8]},
117
+ {"label": "B", "stroke_ids": [9, 10]}
118
+ ],
119
+ "group_boxes": [
120
+ {"ymin": 2000, "xmin": 1040, "ymax": 2360, "xmax": 3000},
121
+ {"ymin": 2000, "xmin": 3380, "ymax": 2360, "xmax": 3800}
122
+ ],
123
+ "erased": []
124
+ },
125
+ {
126
+ "name": "lines",
127
+ "description": "Two lines a cell apart, the second begun 1.5 s after the first, with no pause to think: a group each.",
128
+ "history": {"events": [
129
+ {"t_ms": 128, "write": {"id": 1, "pointer": "pen", "points": [{"x": 104, "y": 210.8, "t_ms": 0}, {"x": 112, "y": 200, "t_ms": 32}, {"x": 112, "y": 236, "t_ms": 128}]}},
130
+ {"t_ms": 586, "write": {"id": 2, "pointer": "pen", "points": [{"x": 126, "y": 207.2, "t_ms": 378}, {"x": 132, "y": 200, "t_ms": 402}, {"x": 140, "y": 200, "t_ms": 426}, {"x": 146, "y": 210.8, "t_ms": 458}, {"x": 144, "y": 218, "t_ms": 482}, {"x": 126, "y": 236, "t_ms": 530}, {"x": 146, "y": 236, "t_ms": 586}]}},
131
+ {"t_ms": 1150, "write": {"id": 3, "pointer": "pen", "points": [{"x": 188, "y": 207.2, "t_ms": 1086}, {"x": 188, "y": 228.8, "t_ms": 1150}]}},
132
+ {"t_ms": 1332, "write": {"id": 4, "pointer": "pen", "points": [{"x": 182, "y": 218, "t_ms": 1300}, {"x": 194, "y": 218, "t_ms": 1332}]}},
133
+ {"t_ms": 2008, "write": {"id": 5, "pointer": "pen", "points": [{"x": 232, "y": 200, "t_ms": 1832}, {"x": 232, "y": 214.4, "t_ms": 1872}, {"x": 242, "y": 214.4, "t_ms": 1904}, {"x": 248, "y": 221.6, "t_ms": 1928}, {"x": 248, "y": 228.8, "t_ms": 1952}, {"x": 242, "y": 236, "t_ms": 1976}, {"x": 230, "y": 232.4, "t_ms": 2008}]}},
134
+ {"t_ms": 2206, "write": {"id": 6, "pointer": "pen", "points": [{"x": 232, "y": 200, "t_ms": 2158}, {"x": 248, "y": 200, "t_ms": 2206}]}},
135
+ {"t_ms": 2754, "write": {"id": 7, "pointer": "pen", "points": [{"x": 284, "y": 210.8, "t_ms": 2706}, {"x": 300, "y": 210.8, "t_ms": 2754}]}},
136
+ {"t_ms": 2952, "write": {"id": 8, "pointer": "pen", "points": [{"x": 284, "y": 225.2, "t_ms": 2904}, {"x": 300, "y": 225.2, "t_ms": 2952}]}},
137
+ {"t_ms": 3580, "write": {"id": 9, "pointer": "pen", "points": [{"x": 338, "y": 210.8, "t_ms": 3452}, {"x": 346, "y": 200, "t_ms": 3484}, {"x": 346, "y": 236, "t_ms": 3580}]}},
138
+ {"t_ms": 3982, "write": {"id": 10, "pointer": "pen", "points": [{"x": 360, "y": 200, "t_ms": 3830}, {"x": 380, "y": 200, "t_ms": 3886}, {"x": 368, "y": 236, "t_ms": 3982}]}},
139
+ {"t_ms": 5610, "write": {"id": 11, "pointer": "pen", "points": [{"x": 104, "y": 260.8, "t_ms": 5482}, {"x": 112, "y": 250, "t_ms": 5514}, {"x": 112, "y": 286, "t_ms": 5610}]}},
140
+ {"t_ms": 6012, "write": {"id": 12, "pointer": "pen", "points": [{"x": 126, "y": 250, "t_ms": 5860}, {"x": 146, "y": 250, "t_ms": 5916}, {"x": 134, "y": 286, "t_ms": 6012}]}},
141
+ {"t_ms": 6560, "write": {"id": 13, "pointer": "pen", "points": [{"x": 180, "y": 268, "t_ms": 6512}, {"x": 196, "y": 268, "t_ms": 6560}]}},
142
+ {"t_ms": 7188, "write": {"id": 14, "pointer": "pen", "points": [{"x": 244, "y": 250, "t_ms": 7060}, {"x": 230, "y": 275.2, "t_ms": 7132}, {"x": 250, "y": 275.2, "t_ms": 7188}]}},
143
+ {"t_ms": 7410, "write": {"id": 15, "pointer": "pen", "points": [{"x": 244, "y": 260.8, "t_ms": 7338}, {"x": 244, "y": 286, "t_ms": 7410}]}},
144
+ {"t_ms": 7958, "write": {"id": 16, "pointer": "pen", "points": [{"x": 284, "y": 260.8, "t_ms": 7910}, {"x": 300, "y": 260.8, "t_ms": 7958}]}},
145
+ {"t_ms": 8156, "write": {"id": 17, "pointer": "pen", "points": [{"x": 284, "y": 275.2, "t_ms": 8108}, {"x": 300, "y": 275.2, "t_ms": 8156}]}},
146
+ {"t_ms": 8784, "write": {"id": 18, "pointer": "pen", "points": [{"x": 338, "y": 260.8, "t_ms": 8656}, {"x": 346, "y": 250, "t_ms": 8688}, {"x": 346, "y": 286, "t_ms": 8784}]}},
147
+ {"t_ms": 9234, "write": {"id": 19, "pointer": "pen", "points": [{"x": 360, "y": 253.6, "t_ms": 9034}, {"x": 368, "y": 250, "t_ms": 9058}, {"x": 376, "y": 253.6, "t_ms": 9082}, {"x": 378, "y": 260.8, "t_ms": 9106}, {"x": 370, "y": 268, "t_ms": 9130}, {"x": 378, "y": 275.2, "t_ms": 9154}, {"x": 378, "y": 282.4, "t_ms": 9178}, {"x": 370, "y": 286, "t_ms": 9202}, {"x": 360, "y": 282.4, "t_ms": 9234}]}}
148
+ ]},
149
+ "visible": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
150
+ "neighbours": [
151
+ [1, 2],
152
+ [2, 3],
153
+ [2, 4],
154
+ [3, 4],
155
+ [3, 5],
156
+ [3, 6],
157
+ [4, 5],
158
+ [4, 6],
159
+ [5, 6],
160
+ [5, 7],
161
+ [5, 8],
162
+ [6, 7],
163
+ [6, 8],
164
+ [7, 8],
165
+ [7, 9],
166
+ [8, 9],
167
+ [9, 10],
168
+ [11, 12],
169
+ [12, 13],
170
+ [13, 14],
171
+ [13, 15],
172
+ [14, 15],
173
+ [14, 16],
174
+ [14, 17],
175
+ [15, 16],
176
+ [15, 17],
177
+ [16, 17],
178
+ [16, 18],
179
+ [17, 18],
180
+ [18, 19]
181
+ ],
182
+ "groups": [
183
+ {"label": "A", "stroke_ids": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]},
184
+ {"label": "B", "stroke_ids": [11, 12, 13, 14, 15, 16, 17, 18, 19]}
185
+ ],
186
+ "group_boxes": [
187
+ {"ymin": 2000, "xmin": 1040, "ymax": 2360, "xmax": 3800},
188
+ {"ymin": 2500, "xmin": 1040, "ymax": 2860, "xmax": 3780}
189
+ ],
190
+ "erased": []
191
+ },
192
+ {
193
+ "name": "signs",
194
+ "description": "3/4 + 1/4 = 1 in fractions over bars, underlined; 3 s later «12 : 4 = 3» below: a group each, with their bars, dots and lines.",
195
+ "history": {"events": [
196
+ {"t_ms": 176, "write": {"id": 1, "pointer": "pen", "points": [{"x": 100, "y": 303, "t_ms": 0}, {"x": 107.2, "y": 300, "t_ms": 24}, {"x": 114.4, "y": 303, "t_ms": 48}, {"x": 116.2, "y": 309, "t_ms": 64}, {"x": 109, "y": 315, "t_ms": 88}, {"x": 116.2, "y": 321, "t_ms": 112}, {"x": 116.2, "y": 327, "t_ms": 128}, {"x": 109, "y": 330, "t_ms": 152}, {"x": 100, "y": 327, "t_ms": 176}]}},
197
+ {"t_ms": 490, "write": {"id": 2, "pointer": "pen", "points": [{"x": 98, "y": 336, "t_ms": 426}, {"x": 120, "y": 336, "t_ms": 490}]}},
198
+ {"t_ms": 844, "write": {"id": 3, "pointer": "pen", "points": [{"x": 112.6, "y": 342, "t_ms": 740}, {"x": 100, "y": 363, "t_ms": 796}, {"x": 118, "y": 363, "t_ms": 844}]}},
199
+ {"t_ms": 1050, "write": {"id": 4, "pointer": "pen", "points": [{"x": 112.6, "y": 351, "t_ms": 994}, {"x": 112.6, "y": 372, "t_ms": 1050}]}},
200
+ {"t_ms": 1348, "write": {"id": 5, "pointer": "pen", "points": [{"x": 139, "y": 327, "t_ms": 1300}, {"x": 139, "y": 345, "t_ms": 1348}]}},
201
+ {"t_ms": 1530, "write": {"id": 6, "pointer": "pen", "points": [{"x": 133.6, "y": 336, "t_ms": 1498}, {"x": 144.4, "y": 336, "t_ms": 1530}]}},
202
+ {"t_ms": 1884, "write": {"id": 7, "pointer": "pen", "points": [{"x": 163.6, "y": 309, "t_ms": 1780}, {"x": 170.8, "y": 300, "t_ms": 1804}, {"x": 170.8, "y": 330, "t_ms": 1884}]}},
203
+ {"t_ms": 2198, "write": {"id": 8, "pointer": "pen", "points": [{"x": 158, "y": 336, "t_ms": 2134}, {"x": 180, "y": 336, "t_ms": 2198}]}},
204
+ {"t_ms": 2552, "write": {"id": 9, "pointer": "pen", "points": [{"x": 172.6, "y": 342, "t_ms": 2448}, {"x": 160, "y": 363, "t_ms": 2504}, {"x": 178, "y": 363, "t_ms": 2552}]}},
205
+ {"t_ms": 2758, "write": {"id": 10, "pointer": "pen", "points": [{"x": 172.6, "y": 351, "t_ms": 2702}, {"x": 172.6, "y": 372, "t_ms": 2758}]}},
206
+ {"t_ms": 3048, "write": {"id": 11, "pointer": "pen", "points": [{"x": 191.8, "y": 330, "t_ms": 3008}, {"x": 206.2, "y": 330, "t_ms": 3048}]}},
207
+ {"t_ms": 3238, "write": {"id": 12, "pointer": "pen", "points": [{"x": 191.8, "y": 342, "t_ms": 3198}, {"x": 206.2, "y": 342, "t_ms": 3238}]}},
208
+ {"t_ms": 3616, "write": {"id": 13, "pointer": "pen", "points": [{"x": 224, "y": 328.8, "t_ms": 3488}, {"x": 232, "y": 318, "t_ms": 3520}, {"x": 232, "y": 354, "t_ms": 3616}]}},
209
+ {"t_ms": 4416, "write": {"id": 14, "pointer": "pen", "points": [{"x": 95, "y": 378, "t_ms": 4016}, {"x": 245, "y": 378, "t_ms": 4416}]}},
210
+ {"t_ms": 7544, "write": {"id": 15, "pointer": "pen", "points": [{"x": 104, "y": 440.8, "t_ms": 7416}, {"x": 112, "y": 430, "t_ms": 7448}, {"x": 112, "y": 466, "t_ms": 7544}]}},
211
+ {"t_ms": 8002, "write": {"id": 16, "pointer": "pen", "points": [{"x": 126, "y": 437.2, "t_ms": 7794}, {"x": 132, "y": 430, "t_ms": 7818}, {"x": 140, "y": 430, "t_ms": 7842}, {"x": 146, "y": 440.8, "t_ms": 7874}, {"x": 144, "y": 448, "t_ms": 7898}, {"x": 126, "y": 466, "t_ms": 7946}, {"x": 146, "y": 466, "t_ms": 8002}]}},
212
+ {"t_ms": 8532, "write": {"id": 17, "pointer": "pen", "points": [{"x": 188, "y": 440.8, "t_ms": 8502}, {"x": 188, "y": 440.8, "t_ms": 8532}]}},
213
+ {"t_ms": 8712, "write": {"id": 18, "pointer": "pen", "points": [{"x": 188, "y": 455.2, "t_ms": 8682}, {"x": 188, "y": 455.2, "t_ms": 8712}]}},
214
+ {"t_ms": 9340, "write": {"id": 19, "pointer": "pen", "points": [{"x": 244, "y": 430, "t_ms": 9212}, {"x": 230, "y": 455.2, "t_ms": 9284}, {"x": 250, "y": 455.2, "t_ms": 9340}]}},
215
+ {"t_ms": 9562, "write": {"id": 20, "pointer": "pen", "points": [{"x": 244, "y": 440.8, "t_ms": 9490}, {"x": 244, "y": 466, "t_ms": 9562}]}},
216
+ {"t_ms": 10110, "write": {"id": 21, "pointer": "pen", "points": [{"x": 284, "y": 440.8, "t_ms": 10062}, {"x": 300, "y": 440.8, "t_ms": 10110}]}},
217
+ {"t_ms": 10308, "write": {"id": 22, "pointer": "pen", "points": [{"x": 284, "y": 455.2, "t_ms": 10260}, {"x": 300, "y": 455.2, "t_ms": 10308}]}},
218
+ {"t_ms": 11008, "write": {"id": 23, "pointer": "pen", "points": [{"x": 334, "y": 433.6, "t_ms": 10808}, {"x": 342, "y": 430, "t_ms": 10832}, {"x": 350, "y": 433.6, "t_ms": 10856}, {"x": 352, "y": 440.8, "t_ms": 10880}, {"x": 344, "y": 448, "t_ms": 10904}, {"x": 352, "y": 455.2, "t_ms": 10928}, {"x": 352, "y": 462.4, "t_ms": 10952}, {"x": 344, "y": 466, "t_ms": 10976}, {"x": 334, "y": 462.4, "t_ms": 11008}]}}
219
+ ]},
220
+ "visible": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
221
+ "neighbours": [
222
+ [1, 2],
223
+ [1, 3],
224
+ [1, 4],
225
+ [1, 5],
226
+ [1, 6],
227
+ [1, 7],
228
+ [1, 8],
229
+ [2, 3],
230
+ [2, 4],
231
+ [2, 5],
232
+ [2, 6],
233
+ [2, 7],
234
+ [2, 8],
235
+ [2, 9],
236
+ [3, 4],
237
+ [3, 5],
238
+ [3, 6],
239
+ [3, 7],
240
+ [3, 8],
241
+ [3, 9],
242
+ [4, 5],
243
+ [4, 6],
244
+ [4, 8],
245
+ [4, 9],
246
+ [5, 6],
247
+ [5, 7],
248
+ [5, 8],
249
+ [5, 9],
250
+ [5, 10],
251
+ [6, 7],
252
+ [6, 8],
253
+ [6, 9],
254
+ [6, 10],
255
+ [6, 11],
256
+ [6, 12],
257
+ [7, 8],
258
+ [7, 9],
259
+ [7, 10],
260
+ [7, 11],
261
+ [7, 12],
262
+ [8, 9],
263
+ [8, 10],
264
+ [8, 11],
265
+ [8, 12],
266
+ [8, 13],
267
+ [8, 14],
268
+ [9, 10],
269
+ [9, 11],
270
+ [9, 12],
271
+ [9, 13],
272
+ [9, 14],
273
+ [10, 11],
274
+ [10, 12],
275
+ [10, 14],
276
+ [11, 12],
277
+ [11, 13],
278
+ [11, 14],
279
+ [12, 13],
280
+ [12, 14],
281
+ [13, 14],
282
+ [15, 16],
283
+ [16, 17],
284
+ [16, 18],
285
+ [17, 18],
286
+ [17, 19],
287
+ [18, 19],
288
+ [19, 20],
289
+ [19, 21],
290
+ [19, 22],
291
+ [20, 21],
292
+ [20, 22],
293
+ [21, 22],
294
+ [21, 23],
295
+ [22, 23]
296
+ ],
297
+ "groups": [
298
+ {"label": "A", "stroke_ids": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]},
299
+ {"label": "B", "stroke_ids": [15, 16, 17, 18, 19, 20, 21, 22, 23]}
300
+ ],
301
+ "group_boxes": [
302
+ {"ymin": 3000, "xmin": 950, "ymax": 3780, "xmax": 2450},
303
+ {"ymin": 4300, "xmin": 1040, "ymax": 4660, "xmax": 3520}
304
+ ],
305
+ "erased": []
306
+ },
307
+ {
308
+ "name": "words",
309
+ "description": "Two lines of joined-up words, each word a stroke, with the dot of an i put after its word: a group a line.",
310
+ "history": {"events": [
311
+ {"t_ms": 560, "write": {"id": 1, "pointer": "pen", "points": [{"x": 100, "y": 520, "t_ms": 0}, {"x": 106, "y": 500, "t_ms": 56}, {"x": 112, "y": 520, "t_ms": 112}, {"x": 118, "y": 500, "t_ms": 168}, {"x": 124, "y": 520, "t_ms": 224}, {"x": 130, "y": 500, "t_ms": 280}, {"x": 136, "y": 520, "t_ms": 336}, {"x": 142, "y": 500, "t_ms": 392}, {"x": 148, "y": 520, "t_ms": 448}, {"x": 154, "y": 500, "t_ms": 504}, {"x": 160, "y": 520, "t_ms": 560}]}},
312
+ {"t_ms": 890, "write": {"id": 2, "pointer": "pen", "points": [{"x": 130, "y": 490, "t_ms": 860}, {"x": 130, "y": 490, "t_ms": 890}]}},
313
+ {"t_ms": 1364, "write": {"id": 3, "pointer": "pen", "points": [{"x": 180, "y": 520, "t_ms": 1140}, {"x": 186, "y": 500, "t_ms": 1196}, {"x": 192, "y": 520, "t_ms": 1252}, {"x": 198, "y": 500, "t_ms": 1308}, {"x": 204, "y": 520, "t_ms": 1364}]}},
314
+ {"t_ms": 1694, "write": {"id": 4, "pointer": "pen", "points": [{"x": 186, "y": 490, "t_ms": 1664}, {"x": 186, "y": 490, "t_ms": 1694}]}},
315
+ {"t_ms": 2392, "write": {"id": 5, "pointer": "pen", "points": [{"x": 224, "y": 520, "t_ms": 1944}, {"x": 230, "y": 500, "t_ms": 2000}, {"x": 236, "y": 520, "t_ms": 2056}, {"x": 242, "y": 500, "t_ms": 2112}, {"x": 248, "y": 520, "t_ms": 2168}, {"x": 254, "y": 500, "t_ms": 2224}, {"x": 260, "y": 520, "t_ms": 2280}, {"x": 266, "y": 500, "t_ms": 2336}, {"x": 272, "y": 520, "t_ms": 2392}]}},
316
+ {"t_ms": 4228, "write": {"id": 6, "pointer": "pen", "points": [{"x": 100, "y": 580, "t_ms": 3892}, {"x": 106, "y": 560, "t_ms": 3948}, {"x": 112, "y": 580, "t_ms": 4004}, {"x": 118, "y": 560, "t_ms": 4060}, {"x": 124, "y": 580, "t_ms": 4116}, {"x": 130, "y": 560, "t_ms": 4172}, {"x": 136, "y": 580, "t_ms": 4228}]}},
317
+ {"t_ms": 5150, "write": {"id": 7, "pointer": "pen", "points": [{"x": 156, "y": 580, "t_ms": 4478}, {"x": 162, "y": 560, "t_ms": 4534}, {"x": 168, "y": 580, "t_ms": 4590}, {"x": 174, "y": 560, "t_ms": 4646}, {"x": 180, "y": 580, "t_ms": 4702}, {"x": 186, "y": 560, "t_ms": 4758}, {"x": 192, "y": 580, "t_ms": 4814}, {"x": 198, "y": 560, "t_ms": 4870}, {"x": 204, "y": 580, "t_ms": 4926}, {"x": 210, "y": 560, "t_ms": 4982}, {"x": 216, "y": 580, "t_ms": 5038}, {"x": 222, "y": 560, "t_ms": 5094}, {"x": 228, "y": 580, "t_ms": 5150}]}},
318
+ {"t_ms": 5480, "write": {"id": 8, "pointer": "pen", "points": [{"x": 162, "y": 550, "t_ms": 5450}, {"x": 162, "y": 550, "t_ms": 5480}]}}
319
+ ]},
320
+ "visible": [1, 2, 3, 4, 5, 6, 7, 8],
321
+ "neighbours": [
322
+ [1, 2],
323
+ [1, 3],
324
+ [1, 4],
325
+ [2, 3],
326
+ [3, 4],
327
+ [3, 5],
328
+ [4, 5],
329
+ [6, 7],
330
+ [6, 8],
331
+ [7, 8]
332
+ ],
333
+ "groups": [
334
+ {"label": "A", "stroke_ids": [1, 2, 3, 4, 5]},
335
+ {"label": "B", "stroke_ids": [6, 7, 8]}
336
+ ],
337
+ "group_boxes": [
338
+ {"ymin": 4900, "xmin": 1000, "ymax": 5200, "xmax": 2720},
339
+ {"ymin": 5500, "xmin": 1000, "ymax": 5800, "xmax": 2280}
340
+ ],
341
+ "erased": []
342
+ },
343
+ {
344
+ "name": "tutor",
345
+ "description": "Two lines as tutor's synthetic writer draws them: digits 36 high, 26 apart, lines 80 apart, 1.5 s before a line and 120 to 249 ms between strokes.",
346
+ "history": {"events": [
347
+ {"t_ms": 128, "write": {"id": 1, "pointer": "pen", "points": [{"x": 74, "y": 100, "t_ms": 0}, {"x": 60, "y": 125.2, "t_ms": 72}, {"x": 80, "y": 125.2, "t_ms": 128}]}},
348
+ {"t_ms": 373, "write": {"id": 2, "pointer": "pen", "points": [{"x": 74, "y": 110.8, "t_ms": 301}, {"x": 74, "y": 136, "t_ms": 373}]}},
349
+ {"t_ms": 716, "write": {"id": 3, "pointer": "pen", "points": [{"x": 86, "y": 100, "t_ms": 564}, {"x": 106, "y": 100, "t_ms": 620}, {"x": 94, "y": 136, "t_ms": 716}]}},
350
+ {"t_ms": 1115, "write": {"id": 4, "pointer": "pen", "points": [{"x": 148, "y": 107.2, "t_ms": 1051}, {"x": 148, "y": 128.8, "t_ms": 1115}]}},
351
+ {"t_ms": 1320, "write": {"id": 5, "pointer": "pen", "points": [{"x": 142, "y": 118, "t_ms": 1288}, {"x": 154, "y": 118, "t_ms": 1320}]}},
352
+ {"t_ms": 1807, "write": {"id": 6, "pointer": "pen", "points": [{"x": 194, "y": 110.8, "t_ms": 1679}, {"x": 202, "y": 100, "t_ms": 1711}, {"x": 202, "y": 136, "t_ms": 1807}]}},
353
+ {"t_ms": 2187, "write": {"id": 7, "pointer": "pen", "points": [{"x": 234, "y": 114.4, "t_ms": 1963}, {"x": 226, "y": 118, "t_ms": 1987}, {"x": 218, "y": 114.4, "t_ms": 2011}, {"x": 218, "y": 103.6, "t_ms": 2043}, {"x": 226, "y": 100, "t_ms": 2067}, {"x": 234, "y": 103.6, "t_ms": 2091}, {"x": 234, "y": 114.4, "t_ms": 2123}, {"x": 232, "y": 136, "t_ms": 2187}]}},
354
+ {"t_ms": 2630, "write": {"id": 8, "pointer": "pen", "points": [{"x": 270, "y": 110.8, "t_ms": 2582}, {"x": 286, "y": 110.8, "t_ms": 2630}]}},
355
+ {"t_ms": 2851, "write": {"id": 9, "pointer": "pen", "points": [{"x": 270, "y": 125.2, "t_ms": 2803}, {"x": 286, "y": 125.2, "t_ms": 2851}]}},
356
+ {"t_ms": 3494, "write": {"id": 10, "pointer": "pen", "points": [{"x": 336, "y": 100, "t_ms": 3270}, {"x": 326, "y": 107.2, "t_ms": 3302}, {"x": 320, "y": 121.6, "t_ms": 3342}, {"x": 322, "y": 132.4, "t_ms": 3374}, {"x": 330, "y": 136, "t_ms": 3398}, {"x": 338, "y": 128.8, "t_ms": 3422}, {"x": 338, "y": 121.6, "t_ms": 3446}, {"x": 330, "y": 118, "t_ms": 3470}, {"x": 322, "y": 121.6, "t_ms": 3494}]}},
357
+ {"t_ms": 3839, "write": {"id": 11, "pointer": "pen", "points": [{"x": 362, "y": 100, "t_ms": 3615}, {"x": 352, "y": 107.2, "t_ms": 3647}, {"x": 346, "y": 121.6, "t_ms": 3687}, {"x": 348, "y": 132.4, "t_ms": 3719}, {"x": 356, "y": 136, "t_ms": 3743}, {"x": 364, "y": 128.8, "t_ms": 3767}, {"x": 364, "y": 121.6, "t_ms": 3791}, {"x": 356, "y": 118, "t_ms": 3815}, {"x": 348, "y": 121.6, "t_ms": 3839}]}},
358
+ {"t_ms": 5563, "write": {"id": 12, "pointer": "pen", "points": [{"x": 76, "y": 180, "t_ms": 5339}, {"x": 66, "y": 187.2, "t_ms": 5371}, {"x": 60, "y": 201.6, "t_ms": 5411}, {"x": 62, "y": 212.4, "t_ms": 5443}, {"x": 70, "y": 216, "t_ms": 5467}, {"x": 78, "y": 208.8, "t_ms": 5491}, {"x": 78, "y": 201.6, "t_ms": 5515}, {"x": 70, "y": 198, "t_ms": 5539}, {"x": 62, "y": 201.6, "t_ms": 5563}]}},
359
+ {"t_ms": 5978, "write": {"id": 13, "pointer": "pen", "points": [{"x": 102, "y": 180, "t_ms": 5754}, {"x": 92, "y": 187.2, "t_ms": 5786}, {"x": 86, "y": 201.6, "t_ms": 5826}, {"x": 88, "y": 212.4, "t_ms": 5858}, {"x": 96, "y": 216, "t_ms": 5882}, {"x": 104, "y": 208.8, "t_ms": 5906}, {"x": 104, "y": 201.6, "t_ms": 5930}, {"x": 96, "y": 198, "t_ms": 5954}, {"x": 88, "y": 201.6, "t_ms": 5978}]}},
360
+ {"t_ms": 6343, "write": {"id": 14, "pointer": "pen", "points": [{"x": 148, "y": 190.8, "t_ms": 6313}, {"x": 148, "y": 190.8, "t_ms": 6343}]}},
361
+ {"t_ms": 6546, "write": {"id": 15, "pointer": "pen", "points": [{"x": 148, "y": 205.2, "t_ms": 6516}, {"x": 148, "y": 205.2, "t_ms": 6546}]}},
362
+ {"t_ms": 7129, "write": {"id": 16, "pointer": "pen", "points": [{"x": 206, "y": 180, "t_ms": 6905}, {"x": 196, "y": 187.2, "t_ms": 6937}, {"x": 190, "y": 201.6, "t_ms": 6977}, {"x": 192, "y": 212.4, "t_ms": 7009}, {"x": 200, "y": 216, "t_ms": 7033}, {"x": 208, "y": 208.8, "t_ms": 7057}, {"x": 208, "y": 201.6, "t_ms": 7081}, {"x": 200, "y": 198, "t_ms": 7105}, {"x": 192, "y": 201.6, "t_ms": 7129}]}},
363
+ {"t_ms": 7560, "write": {"id": 17, "pointer": "pen", "points": [{"x": 244, "y": 190.8, "t_ms": 7512}, {"x": 260, "y": 190.8, "t_ms": 7560}]}},
364
+ {"t_ms": 7781, "write": {"id": 18, "pointer": "pen", "points": [{"x": 244, "y": 205.2, "t_ms": 7733}, {"x": 260, "y": 205.2, "t_ms": 7781}]}},
365
+ {"t_ms": 8316, "write": {"id": 19, "pointer": "pen", "points": [{"x": 298, "y": 190.8, "t_ms": 8188}, {"x": 306, "y": 180, "t_ms": 8220}, {"x": 306, "y": 216, "t_ms": 8316}]}},
366
+ {"t_ms": 8624, "write": {"id": 20, "pointer": "pen", "points": [{"x": 324, "y": 190.8, "t_ms": 8496}, {"x": 332, "y": 180, "t_ms": 8528}, {"x": 332, "y": 216, "t_ms": 8624}]}}
367
+ ]},
368
+ "visible": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
369
+ "neighbours": [
370
+ [1, 2],
371
+ [1, 3],
372
+ [2, 3],
373
+ [3, 4],
374
+ [3, 5],
375
+ [4, 5],
376
+ [4, 6],
377
+ [5, 6],
378
+ [6, 7],
379
+ [7, 8],
380
+ [7, 9],
381
+ [8, 9],
382
+ [8, 10],
383
+ [9, 10],
384
+ [10, 11],
385
+ [12, 13],
386
+ [13, 14],
387
+ [13, 15],
388
+ [14, 15],
389
+ [14, 16],
390
+ [15, 16],
391
+ [16, 17],
392
+ [16, 18],
393
+ [17, 18],
394
+ [17, 19],
395
+ [18, 19],
396
+ [19, 20]
397
+ ],
398
+ "groups": [
399
+ {"label": "A", "stroke_ids": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]},
400
+ {"label": "B", "stroke_ids": [12, 13, 14, 15, 16, 17, 18, 19, 20]}
401
+ ],
402
+ "group_boxes": [
403
+ {"ymin": 1000, "xmin": 600, "ymax": 1360, "xmax": 3640},
404
+ {"ymin": 1800, "xmin": 600, "ymax": 2160, "xmax": 3320}
405
+ ],
406
+ "erased": []
407
+ },
408
+ {
409
+ "name": "crossed",
410
+ "description": "A line crossed out at once, 0.4 s after it, which is of its group; another crossed out 3 s after it, which is a group of its own.",
411
+ "history": {"events": [
412
+ {"t_ms": 128, "write": {"id": 1, "pointer": "pen", "points": [{"x": 114, "y": 200, "t_ms": 0}, {"x": 100, "y": 225.2, "t_ms": 72}, {"x": 120, "y": 225.2, "t_ms": 128}]}},
413
+ {"t_ms": 350, "write": {"id": 2, "pointer": "pen", "points": [{"x": 114, "y": 210.8, "t_ms": 278}, {"x": 114, "y": 236, "t_ms": 350}]}},
414
+ {"t_ms": 752, "write": {"id": 3, "pointer": "pen", "points": [{"x": 126, "y": 200, "t_ms": 600}, {"x": 146, "y": 200, "t_ms": 656}, {"x": 134, "y": 236, "t_ms": 752}]}},
415
+ {"t_ms": 1316, "write": {"id": 4, "pointer": "pen", "points": [{"x": 188, "y": 207.2, "t_ms": 1252}, {"x": 188, "y": 228.8, "t_ms": 1316}]}},
416
+ {"t_ms": 1498, "write": {"id": 5, "pointer": "pen", "points": [{"x": 182, "y": 218, "t_ms": 1466}, {"x": 194, "y": 218, "t_ms": 1498}]}},
417
+ {"t_ms": 2126, "write": {"id": 6, "pointer": "pen", "points": [{"x": 234, "y": 210.8, "t_ms": 1998}, {"x": 242, "y": 200, "t_ms": 2030}, {"x": 242, "y": 236, "t_ms": 2126}]}},
418
+ {"t_ms": 2600, "write": {"id": 7, "pointer": "pen", "points": [{"x": 274, "y": 214.4, "t_ms": 2376}, {"x": 266, "y": 218, "t_ms": 2400}, {"x": 258, "y": 214.4, "t_ms": 2424}, {"x": 258, "y": 203.6, "t_ms": 2456}, {"x": 266, "y": 200, "t_ms": 2480}, {"x": 274, "y": 203.6, "t_ms": 2504}, {"x": 274, "y": 214.4, "t_ms": 2536}, {"x": 272, "y": 236, "t_ms": 2600}]}},
419
+ {"t_ms": 3148, "write": {"id": 8, "pointer": "pen", "points": [{"x": 310, "y": 210.8, "t_ms": 3100}, {"x": 326, "y": 210.8, "t_ms": 3148}]}},
420
+ {"t_ms": 3346, "write": {"id": 9, "pointer": "pen", "points": [{"x": 310, "y": 225.2, "t_ms": 3298}, {"x": 326, "y": 225.2, "t_ms": 3346}]}},
421
+ {"t_ms": 4022, "write": {"id": 10, "pointer": "pen", "points": [{"x": 362, "y": 200, "t_ms": 3846}, {"x": 362, "y": 214.4, "t_ms": 3886}, {"x": 372, "y": 214.4, "t_ms": 3918}, {"x": 378, "y": 221.6, "t_ms": 3942}, {"x": 378, "y": 228.8, "t_ms": 3966}, {"x": 372, "y": 236, "t_ms": 3990}, {"x": 360, "y": 232.4, "t_ms": 4022}]}},
422
+ {"t_ms": 4220, "write": {"id": 11, "pointer": "pen", "points": [{"x": 362, "y": 200, "t_ms": 4172}, {"x": 378, "y": 200, "t_ms": 4220}]}},
423
+ {"t_ms": 4694, "write": {"id": 12, "pointer": "pen", "points": [{"x": 402, "y": 200, "t_ms": 4470}, {"x": 392, "y": 207.2, "t_ms": 4502}, {"x": 386, "y": 221.6, "t_ms": 4542}, {"x": 388, "y": 232.4, "t_ms": 4574}, {"x": 396, "y": 236, "t_ms": 4598}, {"x": 404, "y": 228.8, "t_ms": 4622}, {"x": 404, "y": 221.6, "t_ms": 4646}, {"x": 396, "y": 218, "t_ms": 4670}, {"x": 388, "y": 221.6, "t_ms": 4694}]}},
424
+ {"t_ms": 5942, "write": {"id": 13, "pointer": "pen", "points": [{"x": 94, "y": 218, "t_ms": 5094}, {"x": 410, "y": 218, "t_ms": 5942}]}},
425
+ {"t_ms": 9070, "write": {"id": 14, "pointer": "pen", "points": [{"x": 114, "y": 300, "t_ms": 8942}, {"x": 100, "y": 325.2, "t_ms": 9014}, {"x": 120, "y": 325.2, "t_ms": 9070}]}},
426
+ {"t_ms": 9292, "write": {"id": 15, "pointer": "pen", "points": [{"x": 114, "y": 310.8, "t_ms": 9220}, {"x": 114, "y": 336, "t_ms": 9292}]}},
427
+ {"t_ms": 9694, "write": {"id": 16, "pointer": "pen", "points": [{"x": 126, "y": 300, "t_ms": 9542}, {"x": 146, "y": 300, "t_ms": 9598}, {"x": 134, "y": 336, "t_ms": 9694}]}},
428
+ {"t_ms": 10258, "write": {"id": 17, "pointer": "pen", "points": [{"x": 188, "y": 307.2, "t_ms": 10194}, {"x": 188, "y": 328.8, "t_ms": 10258}]}},
429
+ {"t_ms": 10440, "write": {"id": 18, "pointer": "pen", "points": [{"x": 182, "y": 318, "t_ms": 10408}, {"x": 194, "y": 318, "t_ms": 10440}]}},
430
+ {"t_ms": 11068, "write": {"id": 19, "pointer": "pen", "points": [{"x": 234, "y": 310.8, "t_ms": 10940}, {"x": 242, "y": 300, "t_ms": 10972}, {"x": 242, "y": 336, "t_ms": 11068}]}},
431
+ {"t_ms": 11542, "write": {"id": 20, "pointer": "pen", "points": [{"x": 274, "y": 314.4, "t_ms": 11318}, {"x": 266, "y": 318, "t_ms": 11342}, {"x": 258, "y": 314.4, "t_ms": 11366}, {"x": 258, "y": 303.6, "t_ms": 11398}, {"x": 266, "y": 300, "t_ms": 11422}, {"x": 274, "y": 303.6, "t_ms": 11446}, {"x": 274, "y": 314.4, "t_ms": 11478}, {"x": 272, "y": 336, "t_ms": 11542}]}},
432
+ {"t_ms": 12090, "write": {"id": 21, "pointer": "pen", "points": [{"x": 310, "y": 310.8, "t_ms": 12042}, {"x": 326, "y": 310.8, "t_ms": 12090}]}},
433
+ {"t_ms": 12288, "write": {"id": 22, "pointer": "pen", "points": [{"x": 310, "y": 325.2, "t_ms": 12240}, {"x": 326, "y": 325.2, "t_ms": 12288}]}},
434
+ {"t_ms": 13012, "write": {"id": 23, "pointer": "pen", "points": [{"x": 376, "y": 300, "t_ms": 12788}, {"x": 366, "y": 307.2, "t_ms": 12820}, {"x": 360, "y": 321.6, "t_ms": 12860}, {"x": 362, "y": 332.4, "t_ms": 12892}, {"x": 370, "y": 336, "t_ms": 12916}, {"x": 378, "y": 328.8, "t_ms": 12940}, {"x": 378, "y": 321.6, "t_ms": 12964}, {"x": 370, "y": 318, "t_ms": 12988}, {"x": 362, "y": 321.6, "t_ms": 13012}]}},
435
+ {"t_ms": 13486, "write": {"id": 24, "pointer": "pen", "points": [{"x": 402, "y": 300, "t_ms": 13262}, {"x": 392, "y": 307.2, "t_ms": 13294}, {"x": 386, "y": 321.6, "t_ms": 13334}, {"x": 388, "y": 332.4, "t_ms": 13366}, {"x": 396, "y": 336, "t_ms": 13390}, {"x": 404, "y": 328.8, "t_ms": 13414}, {"x": 404, "y": 321.6, "t_ms": 13438}, {"x": 396, "y": 318, "t_ms": 13462}, {"x": 388, "y": 321.6, "t_ms": 13486}]}},
436
+ {"t_ms": 17334, "write": {"id": 25, "pointer": "pen", "points": [{"x": 94, "y": 318, "t_ms": 16486}, {"x": 410, "y": 318, "t_ms": 17334}]}}
437
+ ]},
438
+ "visible": [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],
439
+ "neighbours": [
440
+ [1, 2],
441
+ [1, 3],
442
+ [2, 3],
443
+ [3, 4],
444
+ [3, 5],
445
+ [4, 5],
446
+ [4, 6],
447
+ [5, 6],
448
+ [6, 7],
449
+ [7, 8],
450
+ [7, 9],
451
+ [8, 9],
452
+ [8, 10],
453
+ [8, 11],
454
+ [8, 13],
455
+ [9, 10],
456
+ [9, 11],
457
+ [9, 13],
458
+ [10, 11],
459
+ [10, 12],
460
+ [10, 13],
461
+ [11, 12],
462
+ [11, 13],
463
+ [12, 13],
464
+ [14, 15],
465
+ [14, 16],
466
+ [15, 16],
467
+ [16, 17],
468
+ [16, 18],
469
+ [17, 18],
470
+ [17, 19],
471
+ [18, 19],
472
+ [19, 20],
473
+ [20, 21],
474
+ [20, 22],
475
+ [21, 22],
476
+ [21, 23],
477
+ [22, 23],
478
+ [23, 24]
479
+ ],
480
+ "groups": [
481
+ {"label": "A", "stroke_ids": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]},
482
+ {"label": "B", "stroke_ids": [14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]},
483
+ {"label": "C", "stroke_ids": [25]}
484
+ ],
485
+ "group_boxes": [
486
+ {"ymin": 2000, "xmin": 940, "ymax": 2360, "xmax": 4100},
487
+ {"ymin": 3000, "xmin": 1000, "ymax": 3360, "xmax": 4040},
488
+ {"ymin": 3180, "xmin": 940, "ymax": 3180, "xmax": 4100}
489
+ ],
490
+ "erased": []
491
+ },
492
+ {
493
+ "name": "bridge",
494
+ "description": "«12» and «34» far apart, a line under both 0.3 s on, which joins them; «56» and «78» the same, the line 4 s on, which joins neither.",
495
+ "history": {"events": [
496
+ {"t_ms": 128, "write": {"id": 1, "pointer": "pen", "points": [{"x": 104, "y": 210.8, "t_ms": 0}, {"x": 112, "y": 200, "t_ms": 32}, {"x": 112, "y": 236, "t_ms": 128}]}},
497
+ {"t_ms": 586, "write": {"id": 2, "pointer": "pen", "points": [{"x": 126, "y": 207.2, "t_ms": 378}, {"x": 132, "y": 200, "t_ms": 402}, {"x": 140, "y": 200, "t_ms": 426}, {"x": 146, "y": 210.8, "t_ms": 458}, {"x": 144, "y": 218, "t_ms": 482}, {"x": 126, "y": 236, "t_ms": 530}, {"x": 146, "y": 236, "t_ms": 586}]}},
498
+ {"t_ms": 1286, "write": {"id": 3, "pointer": "pen", "points": [{"x": 220, "y": 203.6, "t_ms": 1086}, {"x": 228, "y": 200, "t_ms": 1110}, {"x": 236, "y": 203.6, "t_ms": 1134}, {"x": 238, "y": 210.8, "t_ms": 1158}, {"x": 230, "y": 218, "t_ms": 1182}, {"x": 238, "y": 225.2, "t_ms": 1206}, {"x": 238, "y": 232.4, "t_ms": 1230}, {"x": 230, "y": 236, "t_ms": 1254}, {"x": 220, "y": 232.4, "t_ms": 1286}]}},
499
+ {"t_ms": 1664, "write": {"id": 4, "pointer": "pen", "points": [{"x": 260, "y": 200, "t_ms": 1536}, {"x": 246, "y": 225.2, "t_ms": 1608}, {"x": 266, "y": 225.2, "t_ms": 1664}]}},
500
+ {"t_ms": 1886, "write": {"id": 5, "pointer": "pen", "points": [{"x": 260, "y": 210.8, "t_ms": 1814}, {"x": 260, "y": 236, "t_ms": 1886}]}},
501
+ {"t_ms": 2642, "write": {"id": 6, "pointer": "pen", "points": [{"x": 98, "y": 245, "t_ms": 2186}, {"x": 268, "y": 245, "t_ms": 2642}]}},
502
+ {"t_ms": 5818, "write": {"id": 7, "pointer": "pen", "points": [{"x": 102, "y": 400, "t_ms": 5642}, {"x": 102, "y": 414.4, "t_ms": 5682}, {"x": 112, "y": 414.4, "t_ms": 5714}, {"x": 118, "y": 421.6, "t_ms": 5738}, {"x": 118, "y": 428.8, "t_ms": 5762}, {"x": 112, "y": 436, "t_ms": 5786}, {"x": 100, "y": 432.4, "t_ms": 5818}]}},
503
+ {"t_ms": 6016, "write": {"id": 8, "pointer": "pen", "points": [{"x": 102, "y": 400, "t_ms": 5968}, {"x": 118, "y": 400, "t_ms": 6016}]}},
504
+ {"t_ms": 6490, "write": {"id": 9, "pointer": "pen", "points": [{"x": 142, "y": 400, "t_ms": 6266}, {"x": 132, "y": 407.2, "t_ms": 6298}, {"x": 126, "y": 421.6, "t_ms": 6338}, {"x": 128, "y": 432.4, "t_ms": 6370}, {"x": 136, "y": 436, "t_ms": 6394}, {"x": 144, "y": 428.8, "t_ms": 6418}, {"x": 144, "y": 421.6, "t_ms": 6442}, {"x": 136, "y": 418, "t_ms": 6466}, {"x": 128, "y": 421.6, "t_ms": 6490}]}},
505
+ {"t_ms": 7142, "write": {"id": 10, "pointer": "pen", "points": [{"x": 220, "y": 400, "t_ms": 6990}, {"x": 240, "y": 400, "t_ms": 7046}, {"x": 228, "y": 436, "t_ms": 7142}]}},
506
+ {"t_ms": 7712, "write": {"id": 11, "pointer": "pen", "points": [{"x": 256, "y": 418, "t_ms": 7392}, {"x": 248, "y": 410.8, "t_ms": 7416}, {"x": 250, "y": 400, "t_ms": 7448}, {"x": 262, "y": 400, "t_ms": 7480}, {"x": 264, "y": 410.8, "t_ms": 7512}, {"x": 256, "y": 418, "t_ms": 7536}, {"x": 246, "y": 425.2, "t_ms": 7568}, {"x": 248, "y": 436, "t_ms": 7600}, {"x": 264, "y": 436, "t_ms": 7648}, {"x": 266, "y": 425.2, "t_ms": 7680}, {"x": 256, "y": 418, "t_ms": 7712}]}},
507
+ {"t_ms": 12168, "write": {"id": 12, "pointer": "pen", "points": [{"x": 98, "y": 445, "t_ms": 11712}, {"x": 268, "y": 445, "t_ms": 12168}]}}
508
+ ]},
509
+ "visible": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
510
+ "neighbours": [
511
+ [1, 2],
512
+ [2, 6],
513
+ [3, 4],
514
+ [3, 5],
515
+ [3, 6],
516
+ [4, 5],
517
+ [4, 6],
518
+ [5, 6],
519
+ [7, 8],
520
+ [7, 9],
521
+ [8, 9],
522
+ [10, 11]
523
+ ],
524
+ "groups": [
525
+ {"label": "A", "stroke_ids": [1, 2, 3, 4, 5, 6]},
526
+ {"label": "B", "stroke_ids": [7, 8, 9]},
527
+ {"label": "C", "stroke_ids": [10, 11]},
528
+ {"label": "D", "stroke_ids": [12]}
529
+ ],
530
+ "group_boxes": [
531
+ {"ymin": 2000, "xmin": 980, "ymax": 2450, "xmax": 2680},
532
+ {"ymin": 4000, "xmin": 1000, "ymax": 4360, "xmax": 1440},
533
+ {"ymin": 4000, "xmin": 2200, "ymax": 4360, "xmax": 2660},
534
+ {"ymin": 4450, "xmin": 980, "ymax": 4450, "xmax": 2680}
535
+ ],
536
+ "erased": []
537
+ },
538
+ {
539
+ "name": "undone",
540
+ "description": "«12» erased and brought back by undo 3 s on, «3» written next to it 0.5 s after that, the sheet cleared and that undone: «12» keeps the time it was written, a group apart from «3».",
541
+ "history": {"events": [
542
+ {"t_ms": 128, "write": {"id": 1, "pointer": "pen", "points": [{"x": 104, "y": 210.8, "t_ms": 0}, {"x": 112, "y": 200, "t_ms": 32}, {"x": 112, "y": 236, "t_ms": 128}]}},
543
+ {"t_ms": 586, "write": {"id": 2, "pointer": "pen", "points": [{"x": 126, "y": 207.2, "t_ms": 378}, {"x": 132, "y": 200, "t_ms": 402}, {"x": 140, "y": 200, "t_ms": 426}, {"x": 146, "y": 210.8, "t_ms": 458}, {"x": 144, "y": 218, "t_ms": 482}, {"x": 126, "y": 236, "t_ms": 530}, {"x": 146, "y": 236, "t_ms": 586}]}},
544
+ {"t_ms": 1286, "erase": {"ids": [1, 2]}},
545
+ {"t_ms": 4286, "undo": {"removed": [], "restored": [1, 2]}},
546
+ {"t_ms": 4986, "write": {"id": 3, "pointer": "pen", "points": [{"x": 160, "y": 203.6, "t_ms": 4786}, {"x": 168, "y": 200, "t_ms": 4810}, {"x": 176, "y": 203.6, "t_ms": 4834}, {"x": 178, "y": 210.8, "t_ms": 4858}, {"x": 170, "y": 218, "t_ms": 4882}, {"x": 178, "y": 225.2, "t_ms": 4906}, {"x": 178, "y": 232.4, "t_ms": 4930}, {"x": 170, "y": 236, "t_ms": 4954}, {"x": 160, "y": 232.4, "t_ms": 4986}]}},
547
+ {"t_ms": 5986, "clear": {"ids": [1, 2, 3]}},
548
+ {"t_ms": 6486, "undo": {"removed": [], "restored": [1, 2, 3]}}
549
+ ]},
550
+ "visible": [1, 2, 3],
551
+ "neighbours": [[1, 2]],
552
+ "groups": [
553
+ {"label": "A", "stroke_ids": [1, 2]},
554
+ {"label": "B", "stroke_ids": [3]}
555
+ ],
556
+ "group_boxes": [
557
+ {"ymin": 2000, "xmin": 1040, "ymax": 2360, "xmax": 1460},
558
+ {"ymin": 2000, "xmin": 1600, "ymax": 2360, "xmax": 1780}
559
+ ],
560
+ "erased": []
561
+ },
562
+ {
563
+ "name": "bounds",
564
+ "description": "Pairs at the rule's bounds and just past them: 2000 and 2001 ms, 50 and 50.1 units across, 50 and 50.1 down.",
565
+ "history": {"events": [
566
+ {"t_ms": 30, "write": {"id": 1, "pointer": "pen", "points": [{"x": 100, "y": 100, "t_ms": 0}, {"x": 100, "y": 100, "t_ms": 30}]}},
567
+ {"t_ms": 2060, "write": {"id": 2, "pointer": "pen", "points": [{"x": 110, "y": 100, "t_ms": 2030}, {"x": 110, "y": 100, "t_ms": 2060}]}},
568
+ {"t_ms": 2190, "write": {"id": 3, "pointer": "pen", "points": [{"x": 300, "y": 100, "t_ms": 2160}, {"x": 300, "y": 100, "t_ms": 2190}]}},
569
+ {"t_ms": 4221, "write": {"id": 4, "pointer": "pen", "points": [{"x": 310, "y": 100, "t_ms": 4191}, {"x": 310, "y": 100, "t_ms": 4221}]}},
570
+ {"t_ms": 4433, "write": {"id": 5, "pointer": "pen", "points": [{"x": 100, "y": 300, "t_ms": 4321}, {"x": 100, "y": 340, "t_ms": 4433}]}},
571
+ {"t_ms": 4645, "write": {"id": 6, "pointer": "pen", "points": [{"x": 150, "y": 300, "t_ms": 4533}, {"x": 150, "y": 340, "t_ms": 4645}]}},
572
+ {"t_ms": 4857, "write": {"id": 7, "pointer": "pen", "points": [{"x": 300, "y": 300, "t_ms": 4745}, {"x": 300, "y": 340, "t_ms": 4857}]}},
573
+ {"t_ms": 5069, "write": {"id": 8, "pointer": "pen", "points": [{"x": 350.1, "y": 300, "t_ms": 4957}, {"x": 350.1, "y": 340, "t_ms": 5069}]}},
574
+ {"t_ms": 5281, "write": {"id": 9, "pointer": "pen", "points": [{"x": 100, "y": 500, "t_ms": 5169}, {"x": 140, "y": 500, "t_ms": 5281}]}},
575
+ {"t_ms": 5493, "write": {"id": 10, "pointer": "pen", "points": [{"x": 100, "y": 550, "t_ms": 5381}, {"x": 140, "y": 550, "t_ms": 5493}]}},
576
+ {"t_ms": 5705, "write": {"id": 11, "pointer": "pen", "points": [{"x": 300, "y": 700, "t_ms": 5593}, {"x": 340, "y": 700, "t_ms": 5705}]}},
577
+ {"t_ms": 5917, "write": {"id": 12, "pointer": "pen", "points": [{"x": 300, "y": 750.1, "t_ms": 5805}, {"x": 340, "y": 750.1, "t_ms": 5917}]}}
578
+ ]},
579
+ "visible": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
580
+ "neighbours": [
581
+ [1, 2],
582
+ [5, 6],
583
+ [9, 10]
584
+ ],
585
+ "groups": [
586
+ {"label": "A", "stroke_ids": [1, 2]},
587
+ {"label": "B", "stroke_ids": [3]},
588
+ {"label": "C", "stroke_ids": [4]},
589
+ {"label": "D", "stroke_ids": [5, 6]},
590
+ {"label": "E", "stroke_ids": [7]},
591
+ {"label": "F", "stroke_ids": [8]},
592
+ {"label": "G", "stroke_ids": [9, 10]},
593
+ {"label": "H", "stroke_ids": [11]},
594
+ {"label": "I", "stroke_ids": [12]}
595
+ ],
596
+ "group_boxes": [
597
+ {"ymin": 1000, "xmin": 1000, "ymax": 1000, "xmax": 1100},
598
+ {"ymin": 1000, "xmin": 3000, "ymax": 1000, "xmax": 3000},
599
+ {"ymin": 1000, "xmin": 3100, "ymax": 1000, "xmax": 3100},
600
+ {"ymin": 3000, "xmin": 1000, "ymax": 3400, "xmax": 1500},
601
+ {"ymin": 3000, "xmin": 3000, "ymax": 3400, "xmax": 3000},
602
+ {"ymin": 3000, "xmin": 3501, "ymax": 3400, "xmax": 3501},
603
+ {"ymin": 5000, "xmin": 1000, "ymax": 5500, "xmax": 1400},
604
+ {"ymin": 7000, "xmin": 3000, "ymax": 7000, "xmax": 3400},
605
+ {"ymin": 7501, "xmin": 3000, "ymax": 7501, "xmax": 3400}
606
+ ],
607
+ "erased": []
608
+ },
609
+ {
610
+ "name": "rounding",
611
+ "description": "Dots in hundredths of a unit, in pairs. The rule takes a place in tenths, rounding half up: 100.05 units are 1001 tenths, so the first pair is 500 tenths apart across and the sixth 500 tenths apart down — neighbours both, which rounding half to even or cutting the fraction off would part. The second pair, 50.02 units apart, is 501 tenths, and the third comes out at the bound from just above. The fourth and the fifth are 2000 ms apart, at the bound of the pause.",
612
+ "history": {"events": [
613
+ {"t_ms": 10, "write": {"id": 1, "pointer": "pen", "points": [{"x": 100.05, "y": 100, "t_ms": 10}]}},
614
+ {"t_ms": 20, "write": {"id": 2, "pointer": "pen", "points": [{"x": 150.1, "y": 100, "t_ms": 20}]}},
615
+ {"t_ms": 30, "write": {"id": 3, "pointer": "pen", "points": [{"x": 300.04, "y": 100, "t_ms": 30}]}},
616
+ {"t_ms": 40, "write": {"id": 4, "pointer": "pen", "points": [{"x": 350.06, "y": 100, "t_ms": 40}]}},
617
+ {"t_ms": 50, "write": {"id": 5, "pointer": "pen", "points": [{"x": 500.06, "y": 100, "t_ms": 50}]}},
618
+ {"t_ms": 60, "write": {"id": 6, "pointer": "pen", "points": [{"x": 550.14, "y": 100, "t_ms": 60}]}},
619
+ {"t_ms": 101, "write": {"id": 7, "pointer": "pen", "points": [{"x": 100, "y": 300, "t_ms": 101}]}},
620
+ {"t_ms": 2101, "write": {"id": 8, "pointer": "pen", "points": [{"x": 110, "y": 300, "t_ms": 2101}]}},
621
+ {"t_ms": 3001, "write": {"id": 9, "pointer": "pen", "points": [{"x": 300, "y": 300, "t_ms": 3001}]}},
622
+ {"t_ms": 5001, "write": {"id": 10, "pointer": "pen", "points": [{"x": 310, "y": 300, "t_ms": 5001}]}},
623
+ {"t_ms": 6000, "write": {"id": 11, "pointer": "pen", "points": [{"x": 500, "y": 300.05, "t_ms": 6000}]}},
624
+ {"t_ms": 6010, "write": {"id": 12, "pointer": "pen", "points": [{"x": 500, "y": 350.1, "t_ms": 6010}]}}
625
+ ]},
626
+ "visible": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
627
+ "neighbours": [
628
+ [1, 2],
629
+ [5, 6],
630
+ [7, 8],
631
+ [9, 10],
632
+ [11, 12]
633
+ ],
634
+ "groups": [
635
+ {"label": "A", "stroke_ids": [1, 2]},
636
+ {"label": "B", "stroke_ids": [3]},
637
+ {"label": "C", "stroke_ids": [4]},
638
+ {"label": "D", "stroke_ids": [5, 6]},
639
+ {"label": "E", "stroke_ids": [7, 8]},
640
+ {"label": "F", "stroke_ids": [9, 10]},
641
+ {"label": "G", "stroke_ids": [11, 12]}
642
+ ],
643
+ "group_boxes": [
644
+ {"ymin": 1000, "xmin": 1001, "ymax": 1000, "xmax": 1501},
645
+ {"ymin": 1000, "xmin": 3000, "ymax": 1000, "xmax": 3000},
646
+ {"ymin": 1000, "xmin": 3501, "ymax": 1000, "xmax": 3501},
647
+ {"ymin": 1000, "xmin": 5001, "ymax": 1000, "xmax": 5501},
648
+ {"ymin": 3000, "xmin": 1000, "ymax": 3000, "xmax": 1100},
649
+ {"ymin": 3000, "xmin": 3000, "ymax": 3000, "xmax": 3100},
650
+ {"ymin": 3001, "xmin": 5000, "ymax": 3501, "xmax": 5000}
651
+ ],
652
+ "erased": []
653
+ },
654
+ {
655
+ "name": "erased-alone",
656
+ "description": "A «1» and, far to its right, a «7» erased: the «7» would neighbour no stroke the sheet shows, so it is in no group.",
657
+ "history": {"events": [
658
+ {"t_ms": 300, "write": {"id": 1, "pointer": "pen", "points": [{"x": 120, "y": 200, "t_ms": 0}, {"x": 120, "y": 213.3, "t_ms": 100}, {"x": 120, "y": 226.7, "t_ms": 200}, {"x": 120, "y": 240, "t_ms": 300}]}},
659
+ {"t_ms": 900, "write": {"id": 2, "pointer": "pen", "points": [{"x": 600, "y": 200, "t_ms": 600}, {"x": 610, "y": 213.3, "t_ms": 700}, {"x": 620, "y": 226.7, "t_ms": 800}, {"x": 630, "y": 240, "t_ms": 900}]}},
660
+ {"t_ms": 1500, "erase": {"ids": [2]}}
661
+ ]},
662
+ "visible": [1],
663
+ "neighbours": [],
664
+ "groups": [{"label": "A", "stroke_ids": [1]}],
665
+ "group_boxes": [{"ymin": 2000, "xmin": 1200, "ymax": 2400, "xmax": 1200}],
666
+ "erased": [{"stroke_id": 2, "labels": []}]
667
+ },
668
+ {
669
+ "name": "erased-between",
670
+ "description": "«1», a dash and «7», the dash erased: «1» and «7», 160 units apart, are two groups, and the dash, 30 units from each and written between them, would neighbour both, so it is in both.",
671
+ "history": {"events": [
672
+ {"t_ms": 300, "write": {"id": 1, "pointer": "pen", "points": [{"x": 120, "y": 200, "t_ms": 0}, {"x": 126.7, "y": 213.3, "t_ms": 100}, {"x": 133.3, "y": 226.7, "t_ms": 200}, {"x": 140, "y": 240, "t_ms": 300}]}},
673
+ {"t_ms": 500, "write": {"id": 2, "pointer": "pen", "points": [{"x": 170, "y": 220, "t_ms": 400}, {"x": 203.3, "y": 220, "t_ms": 433}, {"x": 236.7, "y": 220, "t_ms": 467}, {"x": 270, "y": 220, "t_ms": 500}]}},
674
+ {"t_ms": 900, "write": {"id": 3, "pointer": "pen", "points": [{"x": 300, "y": 200, "t_ms": 600}, {"x": 313.3, "y": 213.3, "t_ms": 700}, {"x": 326.7, "y": 226.7, "t_ms": 800}, {"x": 340, "y": 240, "t_ms": 900}]}},
675
+ {"t_ms": 1500, "erase": {"ids": [2]}}
676
+ ]},
677
+ "visible": [1, 3],
678
+ "neighbours": [],
679
+ "groups": [
680
+ {"label": "A", "stroke_ids": [1]},
681
+ {"label": "B", "stroke_ids": [3]}
682
+ ],
683
+ "group_boxes": [
684
+ {"ymin": 2000, "xmin": 1200, "ymax": 2400, "xmax": 1400},
685
+ {"ymin": 2000, "xmin": 3000, "ymax": 2400, "xmax": 3400}
686
+ ],
687
+ "erased": [{"stroke_id": 2, "labels": ["A", "B"]}]
688
+ },
689
+ {
690
+ "name": "erased-within",
691
+ "description": "«1», «2» and «3» in a row, «2» erased: «1» and «3», 20 units apart, are one group still, and «2» neighbours both, so it is in that group, once.",
692
+ "history": {"events": [
693
+ {"t_ms": 300, "write": {"id": 1, "pointer": "pen", "points": [{"x": 120, "y": 200, "t_ms": 0}, {"x": 120, "y": 213.3, "t_ms": 100}, {"x": 120, "y": 226.7, "t_ms": 200}, {"x": 120, "y": 240, "t_ms": 300}]}},
694
+ {"t_ms": 700, "write": {"id": 2, "pointer": "pen", "points": [{"x": 130, "y": 200, "t_ms": 400}, {"x": 136.7, "y": 213.3, "t_ms": 500}, {"x": 143.3, "y": 226.7, "t_ms": 600}, {"x": 150, "y": 240, "t_ms": 700}]}},
695
+ {"t_ms": 1100, "write": {"id": 3, "pointer": "pen", "points": [{"x": 140, "y": 200, "t_ms": 800}, {"x": 150, "y": 213.3, "t_ms": 900}, {"x": 160, "y": 226.7, "t_ms": 1000}, {"x": 170, "y": 240, "t_ms": 1100}]}},
696
+ {"t_ms": 1500, "erase": {"ids": [2]}}
697
+ ]},
698
+ "visible": [1, 3],
699
+ "neighbours": [[1, 3]],
700
+ "groups": [{"label": "A", "stroke_ids": [1, 3]}],
701
+ "group_boxes": [{"ymin": 2000, "xmin": 1200, "ymax": 2400, "xmax": 1700}],
702
+ "erased": [{"stroke_id": 2, "labels": ["A"]}]
703
+ },
704
+ {
705
+ "name": "undone-write",
706
+ "description": "A «4» written in two strokes, the second taken off by an undo: a stroke an undo took off is taken off as an erased one, and it would neighbour the first, so it is in its group.",
707
+ "history": {"events": [
708
+ {"t_ms": 300, "write": {"id": 1, "pointer": "pen", "points": [{"x": 400, "y": 500, "t_ms": 0}, {"x": 393.3, "y": 513.3, "t_ms": 100}, {"x": 386.7, "y": 526.7, "t_ms": 200}, {"x": 380, "y": 540, "t_ms": 300}]}},
709
+ {"t_ms": 800, "write": {"id": 2, "pointer": "pen", "points": [{"x": 400, "y": 500, "t_ms": 500}, {"x": 400, "y": 520, "t_ms": 600}, {"x": 400, "y": 540, "t_ms": 700}, {"x": 400, "y": 560, "t_ms": 800}]}},
710
+ {"t_ms": 1200, "undo": {"removed": [2], "restored": []}}
711
+ ]},
712
+ "visible": [1],
713
+ "neighbours": [],
714
+ "groups": [{"label": "A", "stroke_ids": [1]}],
715
+ "group_boxes": [{"ymin": 5000, "xmin": 3800, "ymax": 5400, "xmax": 4000}],
716
+ "erased": [{"stroke_id": 2, "labels": ["A"]}]
717
+ },
718
+ {
719
+ "name": "cleared",
720
+ "description": "«5» and «8» far apart, the sheet cleared, and 10 s on «3» written where «5» was: the strokes cleared are too long before «3» to be its neighbours, so neither is in a group, though «5» lies where «3» does.",
721
+ "history": {"events": [
722
+ {"t_ms": 300, "write": {"id": 1, "pointer": "pen", "points": [{"x": 120, "y": 200, "t_ms": 0}, {"x": 130, "y": 213.3, "t_ms": 100}, {"x": 140, "y": 226.7, "t_ms": 200}, {"x": 150, "y": 240, "t_ms": 300}]}},
723
+ {"t_ms": 800, "write": {"id": 2, "pointer": "pen", "points": [{"x": 700, "y": 900, "t_ms": 500}, {"x": 710, "y": 913.3, "t_ms": 600}, {"x": 720, "y": 926.7, "t_ms": 700}, {"x": 730, "y": 940, "t_ms": 800}]}},
724
+ {"t_ms": 1200, "clear": {"ids": [1, 2]}},
725
+ {"t_ms": 11500, "write": {"id": 3, "pointer": "pen", "points": [{"x": 120, "y": 200, "t_ms": 11200}, {"x": 130, "y": 213.3, "t_ms": 11300}, {"x": 140, "y": 226.7, "t_ms": 11400}, {"x": 150, "y": 240, "t_ms": 11500}]}}
726
+ ]},
727
+ "visible": [3],
728
+ "neighbours": [],
729
+ "groups": [{"label": "A", "stroke_ids": [3]}],
730
+ "group_boxes": [{"ymin": 2000, "xmin": 1200, "ymax": 2400, "xmax": 1500}],
731
+ "erased": [
732
+ {"stroke_id": 1, "labels": []},
733
+ {"stroke_id": 2, "labels": []}
734
+ ]
735
+ }
736
+ ]
737
+ }