-
Notifications
You must be signed in to change notification settings - Fork 28
/
0001-better-data-structure-for-earley-item-storage.patch
365 lines (353 loc) · 71 KB
/
0001-better-data-structure-for-earley-item-storage.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
From e070b8c690a139e0c2ab9ed7af99d003c0f866e3 Mon Sep 17 00:00:00 2001
From: UmarInvent <[email protected]>
Date: Thu, 7 Jul 2022 12:32:32 +0500
Subject: [PATCH] better data structure for earley item storage adding various
stress tests and customer tests doing refactoring
---
src/earley.cpp | 59 +++++++++++--------
src/earley.h | 20 +++++--
src/tml.g | 1 +
.../earley/24000_15_DYCKs_LANGUAGE.tml.txt | 3 +
tests/development/earley/dycks.tml | 3 +
tests/development/earley/errortest1.tml | 2 +-
tests/development/earley/stress_1024.tml | 11 ++++
tests/development/earley/stress_128.tml | 11 ++++
tests/development/earley/stress_16.tml | 11 ++++
tests/development/earley/stress_32.tml | 11 ++++
tests/development/earley/stress_512.tml | 11 ++++
tests/development/earley/stress_64.tml | 11 ++++
12 files changed, 123 insertions(+), 31 deletions(-)
create mode 100644 tests/development/earley/24000_15_DYCKs_LANGUAGE.tml.txt
create mode 100644 tests/development/earley/dycks.tml
create mode 100644 tests/development/earley/stress_1024.tml
create mode 100644 tests/development/earley/stress_128.tml
create mode 100644 tests/development/earley/stress_16.tml
create mode 100644 tests/development/earley/stress_32.tml
create mode 100644 tests/development/earley/stress_512.tml
create mode 100644 tests/development/earley/stress_64.tml
diff --git a/src/earley.cpp b/src/earley.cpp
index 68acd64..e7d9027 100644
--- a/src/earley.cpp
+++ b/src/earley.cpp
@@ -224,10 +224,11 @@ earley<CharT>::ostream& earley<CharT>::print(earley<CharT>::ostream& os, const i
}
template <typename CharT>
-typename set<typename earley<CharT>::item>::iterator earley<CharT>::add(set<item>& t, const item& i) {
+earley<CharT>::container_iter earley<CharT>::add(container_t& t, const item& i) {
//DBG(print(o::dbg() << "adding ", i) << endl;)
- auto it = S.find(i);
- if (it != S.end()) return it;
+ auto& cont = S[i.set];
+ auto it = cont.find(i);
+ if (it != cont.end()) return it;
if ((it = t.find(i)) != t.end()) return it;
it = t.insert(i).first;
if (nullable(*it))
@@ -237,18 +238,18 @@ typename set<typename earley<CharT>::item>::iterator earley<CharT>::add(set<item
}
template <typename CharT>
-void earley<CharT>::complete(const item& i, set<item>& t) {
+void earley<CharT>::complete(const item& i, container_t& t) {
//DBG(print(o::dbg() << "completing ", i) << endl;)
- for ( auto it = S.lower_bound(item(i.from, 0, 0, 0));
- it != S.end() && it->set == i.from; ++it)
- if ( G[it->prod].size() > it->dot &&
+ const container_t& cont = S[i.from];
+ for ( auto it = cont.begin(); it != cont.end(); ++it)
+ if (G[it->prod].size() > it->dot &&
get_lit(*it) == get_nt(i))
add(t, item(i.set, it->prod, it->from, it->dot + 1));
//completers.insert(i);
}
template <typename CharT>
-void earley<CharT>::predict(const item& i, set<item>& t) {
+void earley<CharT>::predict(const item& i, container_t& t) {
//DBG(print(o::dbg() << "predicting ", i) << endl;)
for (size_t p : nts[get_lit(i)]) {
item j(i.set, p, i.set, 1);
@@ -272,16 +273,16 @@ void earley<CharT>::scan_builtin(const item& i, size_t n, const string& s) {
builtin_char_prod[bid][ch] = p; // store prod of this ch
} else p = it->second; // this ch has its prod already
item j(n + !eof, i.prod, n, 2); // complete builtin
- S.insert(j);
+ S[j.set].insert(j);
item k(n + !eof, p, n, 2); // complete builtin's character
- S.insert(k);
+ S[k.set].insert(k);
}
template <typename CharT>
void earley<CharT>::scan(const item& i, size_t n, CharT ch) {
if (ch != get_lit(i).c()) return;
item j(n + 1, i.prod, i.from, i.dot + 1);
- S.insert(j);
+ S[j.set].insert(j);
//first->advancers.insert(i);
//DBG(print(o::dbg(), i) << ' ';)
//DBG(print(o::dbg() << "scanned " << ch << " and added ", j) << "\n";)
@@ -303,13 +304,15 @@ bool earley<CharT>::recognize(const typename earley<CharT>::string s) {
bin_tnt.clear();
tid = 0;
S.clear();//, S.resize(len + 1);//, C.clear(), C.resize(len + 1);
+ S.resize(len+1);
for (size_t n : nts[start]) {
- auto it = S.emplace(0, n, 0, 1).first;
+ auto& cont = S[0];
+ auto it = cont.emplace(0, n, 0, 1).first;
// fix the bug for missing Start( 0 0) when start is nulllable
if(nullable(*it))
- S.emplace(0, n, 0, 2);
+ cont.emplace(0, n, 0, 2);
}
- set<item> t;
+ container_t t;
#ifdef DEBUG
size_t r = 1, cb = 0; // row and cel beginning
#endif
@@ -319,10 +322,11 @@ bool earley<CharT>::recognize(const typename earley<CharT>::string s) {
emeasure_time_start(tsp, tep);
#endif
do {
- S.insert(t.begin(), t.end());
+ for(const item &x : t) S[x.set].insert(x);
t.clear();
- for ( auto it = S.lower_bound(item(n, 0, 0, 0));
- it != S.end() && it->set == n; ++it) {
+ const auto& cont = S[n];
+ for (auto it = cont.begin();
+ it != cont.end(); ++it) {
//DBG(print(o::dbg() << "processing ", *it) << endl;)
if (completed(*it)) complete(*it, t);
else if (get_lit(*it).is_builtin()) {
@@ -351,12 +355,13 @@ bool earley<CharT>::recognize(const typename earley<CharT>::string s) {
*/
if( true == incr_gen_forest ) {
DBG(o::dbg() << "set: " << n << endl;)
- for ( auto it = S.lower_bound(item(n, 0, 0, 0));
- it != S.end() && it->set == n; ++it)
+ const auto& cont = S[n];
+ for ( auto it = cont.begin();
+ it != cont.end(); ++it)
if(completed(*it)) pre_process(*it);
- for ( auto it = S.lower_bound(item(n, 0, 0, 0));
- it != S.end() && it->set == n; ++it)
+ for ( auto it = cont.begin();
+ it != cont.end(); ++it)
if( completed(*it) ) {
DBG(o::dbg()<<endl<< it->from <<it->set << it->prod << it->dot <<endl);
nidx_t curroot(get_nt(*it), {it->from, it->set});
@@ -367,7 +372,7 @@ bool earley<CharT>::recognize(const typename earley<CharT>::string s) {
}
bool found = false;
for (size_t n : nts[start])
- if (S.find( item(len, n, 0, G[n].size())) != S.end()) {
+ if (S[len].find( item(len, n, 0, G[n].size())) != S[len].end()) {
found = true;
}
emeasure_time_end( tsr, ter ) <<" :: recognize time" <<endl;
@@ -818,10 +823,12 @@ bool earley<CharT>::forest( ){
// preprocess earley items for faster retrieval
emeasure_time_start(tspfo, tepfo);
int count = 0;
- for (const item& i : S) {
- count++;
- pre_process(i);
- }
+
+ for(size_t n=0; n<len+1 ; n++)
+ for (const item& i : S[n]) {
+ count++;
+ pre_process(i);
+ }
emeasure_time_end(tspfo, tepfo) <<" :: preprocess time ,"<< "size : "<< count << endl;
o::inf() <<"sort sizes : " << sorted_citem.size() <<" " << rsorted_citem.size() <<" \n";
diff --git a/src/earley.h b/src/earley.h
index e33a35b..4bfbe82 100644
--- a/src/earley.h
+++ b/src/earley.h
@@ -119,9 +119,6 @@ private:
lit get_nt(const item& i) const { return G[i.prod][0]; }
bool all_nulls(const std::vector<lit>& p) const;
ostream& print(ostream& os, const item& i) const;
- typename std::set<item>::iterator add(std::set<item>& t, const item& i);
- void complete(const item& i, std::set<item>& t);
- void predict(const item& i, std::set<item>& t);
void scan(const item& i, size_t n, CharT ch);
void scan_builtin(const item& i, size_t n, const string& s);
bool nullable(const item& i) const {
@@ -131,7 +128,6 @@ private:
nullables.end()) ||
(!get_lit(i).nt() && get_lit(i).c() == '\0'));
}
- std::set<item> S;
struct {
std::map<string, size_t> m;
@@ -249,6 +245,15 @@ private:
h ^= hash_size_t(size_t(k.l.nt()?k.l.n():k.c()));
return h;
}
+ size_t operator()(const item &k) const {
+ // lets substitute with better if possible.
+ std::size_t h = 0;
+ h ^= hash_size_t(k.set);
+ h ^= hash_size_t(k.from);
+ h ^= hash_size_t(k.prod);
+ h ^= hash_size_t(k.dot);
+ return h;
+ }
};
//std::unordered_map< size_t,
// std::unordered_map<size_t, std::vector<item>>> sorted_citem;
@@ -280,6 +285,13 @@ private:
std::string to_tml_rule(const nidx_t nd) const;
template <typename CharU>
friend int test_out(int c, earley<CharU> &e);
+ typedef std::unordered_set<earley<CharT>::item, earley<CharT>::hasher_t> container_t;
+ typedef container_t::iterator container_iter;
+ std::vector<container_t> S;
+ container_iter add(container_t& t, const item& i);
+ void complete(const item& i, container_t& t);
+ void predict(const item& i, container_t& t);
+
struct overlay_tree {
std::vector<int> choices;
diff --git a/src/tml.g b/src/tml.g
index df8a631..6b63d62 100644
--- a/src/tml.g
+++ b/src/tml.g
@@ -1,3 +1,4 @@
+@string str <errotest1.tml>.
# TML grammar definition file.
#
# This grammar requires the following builtins map to be passed to the parser:
diff --git a/tests/development/earley/24000_15_DYCKs_LANGUAGE.tml.txt b/tests/development/earley/24000_15_DYCKs_LANGUAGE.tml.txt
new file mode 100644
index 0000000..3f02519
--- /dev/null
+++ b/tests/development/earley/24000_15_DYCKs_LANGUAGE.tml.txt
@@ -0,0 +1,3 @@
+# Dyck's language
+@string str "((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()(((()()()((()()())))))))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()))))((()()()(((()()()((()()()))))((()(((()()()((()()(((()()()((()(((()()()(((((()()()((()()())))))()())))))()))))))))))()((()()()))))((()()()((()(((()()()(((((()()()(((((()()()((()(((()()()((()()(((()()()((()()()))))))))))())))))()())))))()())))))()))))(()()()))))((()()()((()()()))))((()()()((()()()))))((()()()((()()()((()()()))))((()()()))))((()()()((()()()))))((()()()((()((()()()((()()()))))()()))))".
+start => '(' start ')' start | null.
diff --git a/tests/development/earley/dycks.tml b/tests/development/earley/dycks.tml
new file mode 100644
index 0000000..f82a9df
--- /dev/null
+++ b/tests/development/earley/dycks.tml
@@ -0,0 +1,3 @@
+# Dyck's language
+@string str "((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()(((((((((()()(((((((((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))(((()()()((()()())))))()(((((()(((()(((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()((((((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()(((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))(((()()((((((()(((()()()((()()())))))(((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))(((((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()(((((((((()()(((((((((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))(((()()()((()()())))))()(((((()(((()(((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()((((((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()(((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))(((()()((((((()(((()()()((()()())))))(((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()(((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()(((((((((()()(((((((((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))(((()()()((()()())))))()(((((()(((()(((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()((((((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()(((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))(((()()((((((()(((()()()((()()())))))(((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()(((((((((()()(((((((((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))(((()()()((()()())))))()(((((()(((()(((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()((((((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()(((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))(((()()((((((()(((()()()((()()())))))(((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()(((((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()(((((((((()()(((((((((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))(((()()()((()()())))))()(((((()(((()(((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()((((((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()(((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))(((()()((((((()(((()()()((()()())))))(((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()()))((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()(((((((((()()(((((((((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))(((()()()((()()())))))()(((((()(((()(((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()((((((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()(((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))(((()()((((((()(((()()()((()()())))))(((()()((((((()(((()()()((()()())))))()(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()()))))()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()()))))))))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))(((((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()((((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()())))))((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))((()()())))))()())))))((()()())))))()())))))()()(((((()()()((()(((()()((((((()(((()()()((()()())))))()((()()())))))()()(((((()()()((()()())))))()())))))((()()())))))())))))()())))))((()()()))))".
+start => '(' start ')' start | null.
diff --git a/tests/development/earley/errortest1.tml b/tests/development/earley/errortest1.tml
index f97526a..c828b7f 100644
--- a/tests/development/earley/errortest1.tml
+++ b/tests/development/earley/errortest1.tml
@@ -13,5 +13,5 @@
start => '+' start | start '+' start | start '+' | '1' .
#start => start '+' start | '2'.
-#!start(0 5).
+!start(0 5).
!node(?x "start" 0 5).
diff --git a/tests/development/earley/stress_1024.tml b/tests/development/earley/stress_1024.tml
new file mode 100644
index 0000000..9db62ea
--- /dev/null
+++ b/tests/development/earley/stress_1024.tml
@@ -0,0 +1,11 @@
+@string str "abcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefgh".
+start => A B C D E F G H A B C D E F G H start | null.
+
+A => 'a'| A | null.
+B => 'b'| B | null.
+C => 'c'| C | null.
+D => 'd'| D | null.
+E => 'e'| E | null.
+F => 'f'| F | null.
+G => 'g'| G | null.
+H => 'h'| H | null.
diff --git a/tests/development/earley/stress_128.tml b/tests/development/earley/stress_128.tml
new file mode 100644
index 0000000..88bb286
--- /dev/null
+++ b/tests/development/earley/stress_128.tml
@@ -0,0 +1,11 @@
+@string str "abcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefgh".
+start => A B C D E F G H A B C D E F G H start | null.
+
+A => 'a'| A | null.
+B => 'b'| B | null.
+C => 'c'| C | null.
+D => 'd'| D | null.
+E => 'e'| E | null.
+F => 'f'| F | null.
+G => 'g'| G | null.
+H => 'h'| H | null.
diff --git a/tests/development/earley/stress_16.tml b/tests/development/earley/stress_16.tml
new file mode 100644
index 0000000..645f5a8
--- /dev/null
+++ b/tests/development/earley/stress_16.tml
@@ -0,0 +1,11 @@
+@string str "abcdefghabcdefgh".
+start => A B C D E F G H A B C D E F G H start | null.
+
+A => 'a'| A | null.
+B => 'b'| B | null.
+C => 'c'| C | null.
+D => 'd'| D | null.
+E => 'e'| E | null.
+F => 'f'| F | null.
+G => 'g'| G | null.
+H => 'h'| H | null.
diff --git a/tests/development/earley/stress_32.tml b/tests/development/earley/stress_32.tml
new file mode 100644
index 0000000..9b50ccf
--- /dev/null
+++ b/tests/development/earley/stress_32.tml
@@ -0,0 +1,11 @@
+@string str "abcdefghabcdefghabcdefghabcdefgh".
+start => A B C D E F G H A B C D E F G H start | null.
+
+A => 'a'| A | null.
+B => 'b'| B | null.
+C => 'c'| C | null.
+D => 'd'| D | null.
+E => 'e'| E | null.
+F => 'f'| F | null.
+G => 'g'| G | null.
+H => 'h'| H | null.
diff --git a/tests/development/earley/stress_512.tml b/tests/development/earley/stress_512.tml
new file mode 100644
index 0000000..99193de
--- /dev/null
+++ b/tests/development/earley/stress_512.tml
@@ -0,0 +1,11 @@
+@string str "abcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefgh".
+start => A B C D E F G H A B C D E F G H start | null.
+
+A => 'a'| A | null.
+B => 'b'| B | null.
+C => 'c'| C | null.
+D => 'd'| D | null.
+E => 'e'| E | null.
+F => 'f'| F | null.
+G => 'g'| G | null.
+H => 'h'| H | null.
diff --git a/tests/development/earley/stress_64.tml b/tests/development/earley/stress_64.tml
new file mode 100644
index 0000000..b478256
--- /dev/null
+++ b/tests/development/earley/stress_64.tml
@@ -0,0 +1,11 @@
+@string str "abcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefgh".
+start => A B C D E F G H A B C D E F G H start | null.
+
+A => 'a'| A | null.
+B => 'b'| B | null.
+C => 'c'| C | null.
+D => 'd'| D | null.
+E => 'e'| E | null.
+F => 'f'| F | null.
+G => 'g'| G | null.
+H => 'h'| H | null.
--
2.25.1