summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Tolnay <dtolnay@gmail.com>2015-06-07 21:45:14 -0700
committerNicolas Williams <nico@cryptonector.com>2015-06-09 17:29:48 -0500
commitd3343d5113251abb13b50f415c94d771492edf94 (patch)
tree3e94c41e765cfa7181a62888d5a4fa988988bcdb
parent2e96fb2c9bf64b2e39a488ff14b2894b43149bec (diff)
array and object destructuring (fix #533)
`. as [$i, $j, $k] | ...` `. as {a: $i, b: $j} | ...` `. as [[[$i]], {a: $j}] | ...` `foreach . as [$i, $j, $k] (...)` `reduce . as {a: $i, b: $j} (...)`
-rw-r--r--compile.c105
-rw-r--r--compile.h7
-rw-r--r--docs/content/3.manual/manual.yml8
-rw-r--r--parser.c1604
-rw-r--r--parser.y64
-rw-r--r--tests/all.test47
6 files changed, 1057 insertions, 778 deletions
diff --git a/compile.c b/compile.c
index 4aa2d211..02653ac7 100644
--- a/compile.c
+++ b/compile.c
@@ -675,15 +675,25 @@ block gen_collect(block expr) {
gen_op_bound(LOADVN, array_var));
}
-block gen_reduce(const char* varname, block source, block init, block body) {
+static block bind_matcher(block matcher, block body) {
+ // cannot call block_bind(matcher, body) because that requires
+ // block_has_only_binders(matcher), which is not true here as matchers
+ // may also contain code to extract the correct elements
+ for (inst* i = matcher.first; i; i = i->next) {
+ if (i->op == STOREV && !i->bound_by)
+ block_bind_subblock(inst_block(i), body, OP_HAS_VARIABLE, 0);
+ }
+ return BLOCK(matcher, body);
+}
+
+block gen_reduce(block source, block matcher, block init, block body) {
block res_var = gen_op_var_fresh(STOREV, "reduce");
block loop = BLOCK(gen_op_simple(DUPN),
source,
- block_bind(gen_op_unbound(STOREV, varname),
- BLOCK(gen_op_bound(LOADVN, res_var),
- body,
- gen_op_bound(STOREV, res_var)),
- OP_HAS_VARIABLE),
+ bind_matcher(matcher,
+ BLOCK(gen_op_bound(LOADVN, res_var),
+ body,
+ gen_op_bound(STOREV, res_var))),
gen_op_simple(BACKTRACK));
return BLOCK(gen_op_simple(DUP),
init,
@@ -693,37 +703,36 @@ block gen_reduce(const char* varname, block source, block init, block body) {
gen_op_bound(LOADVN, res_var));
}
-block gen_foreach(const char* varname, block source, block init, block update, block extract) {
+block gen_foreach(block source, block matcher, block init, block update, block extract) {
block output = gen_op_targetlater(JUMP);
block state_var = gen_op_var_fresh(STOREV, "foreach");
block loop = BLOCK(gen_op_simple(DUPN),
// get a value from the source expression:
source,
- // bind the $varname to that value for all the code in
- // this block_bind() to see:
- block_bind(gen_op_unbound(STOREV, varname),
- // load the loop state variable
- BLOCK(gen_op_bound(LOADVN, state_var),
- // generate updated state
- update,
- // save the updated state for value extraction
- gen_op_simple(DUP),
- // save new state
- gen_op_bound(STOREV, state_var),
- // extract an output...
- extract,
- // ...and output it by jumping
- // past the BACKTRACK that comes
- // right after the loop body,
- // which in turn is there
- // because...
- //
- // (Incidentally, extract can also
- // backtrack, e.g., if it calls
- // empty, in which case we don't
- // get here.)
- output),
- OP_HAS_VARIABLE));
+ // destructure the value into variable(s) for all the code
+ // in the body to see
+ bind_matcher(matcher,
+ // load the loop state variable
+ BLOCK(gen_op_bound(LOADVN, state_var),
+ // generate updated state
+ update,
+ // save the updated state for value extraction
+ gen_op_simple(DUP),
+ // save new state
+ gen_op_bound(STOREV, state_var),
+ // extract an output...
+ extract,
+ // ...and output it by jumping
+ // past the BACKTRACK that comes
+ // right after the loop body,
+ // which in turn is there
+ // because...
+ //
+ // (Incidentally, extract can also
+ // backtrack, e.g., if it calls
+ // empty, in which case we don't
+ // get here.)
+ output)));
block foreach = BLOCK(gen_op_simple(DUP),
init,
state_var,
@@ -809,13 +818,39 @@ block gen_or(block a, block b) {
}
block gen_var_binding(block var, const char* name, block body) {
+ return gen_destructure(var, gen_op_unbound(STOREV, name), body);
+}
+
+block gen_array_matcher(block left, block curr) {
+ int index;
+ if (block_is_noop(left))
+ index = 0;
+ else {
+ // `left` was returned by this function, so the third inst is the
+ // constant containing the previously used index
+ assert(left.first->op == DUP);
+ assert(left.first->next->op == SUBEXP_BEGIN);
+ assert(left.first->next->next->op == LOADK);
+ index = 1 + (int) jv_number_value(left.first->next->next->imm.constant);
+ }
+
+ // `left` goes at the end so that the const index is in a predictable place
+ return BLOCK(gen_op_simple(DUP), gen_subexp(gen_const(jv_number(index))),
+ gen_op_simple(INDEX), curr, left);
+}
+
+block gen_object_matcher(block name, block curr) {
+ return BLOCK(gen_op_simple(DUP), gen_subexp(name), gen_op_simple(INDEX),
+ curr);
+}
+
+block gen_destructure(block var, block matcher, block body) {
// var bindings can be added after coding the program; leave the TOP first.
block top = gen_noop();
if (body.first && body.first->op == TOP)
top = inst_block(block_take(&body));
- return BLOCK(top, gen_op_simple(DUP), var,
- block_bind(gen_op_unbound(STOREV, name),
- body, OP_HAS_VARIABLE));
+
+ return BLOCK(top, gen_op_simple(DUP), var, bind_matcher(matcher, body));
}
// Like gen_var_binding(), but bind `break`'s wildcard unbound variable
diff --git a/compile.h b/compile.h
index 45012847..b3a28230 100644
--- a/compile.h
+++ b/compile.h
@@ -41,14 +41,17 @@ block gen_subexp(block a);
block gen_both(block a, block b);
block gen_const_object(block expr);
block gen_collect(block expr);
-block gen_reduce(const char* varname, block source, block init, block body);
-block gen_foreach(const char* varname, block source, block init, block update, block extract);
+block gen_reduce(block source, block matcher, block init, block body);
+block gen_foreach(block source, block matcher, block init, block update, block extract);
block gen_definedor(block a, block b);
block gen_condbranch(block iftrue, block iffalse);
block gen_and(block a, block b);
block gen_or(block a, block b);
block gen_var_binding(block var, const char* name, block body);
+block gen_array_matcher(block left, block curr);
+block gen_object_matcher(block name, block curr);
+block gen_destructure(block var, block matcher, block body);
block gen_cond(block cond, block iftrue, block iffalse);
block gen_try_handler(block handler);
diff --git a/docs/content/3.manual/manual.yml b/docs/content/3.manual/manual.yml
index 8028e47a..4e3d330c 100644
--- a/docs/content/3.manual/manual.yml
+++ b/docs/content/3.manual/manual.yml
@@ -2147,6 +2147,11 @@ sections:
with `$x` set to that value. Thus `as` functions as something of a
foreach loop.
+ Multiple variables may be declared using a single `as` expression by
+ providing a pattern that matches the structure of the input:
+
+ . as {realnames: $names, posts: [$first, $second]} | ...
+
Variables are scoped over the rest of the expression that defines
them, so
@@ -2171,6 +2176,9 @@ sections:
- program: '. as $i|[(.*2|. as $i| $i), $i]'
input: '5'
output: ['[10,5]']
+ - program: '. as [$a, $b, {c: $c}] | $a + $b + $c'
+ input: '[2, 3, {c: 4, d: 5}]'
+ output: ['9']
- title: 'Defining Functions'
body: |
diff --git a/parser.c b/parser.c
index 35cbe69f..63cbcb93 100644
--- a/parser.c
+++ b/parser.c
@@ -650,16 +650,16 @@ union yyalloc
/* YYFINAL -- State number of the termination state. */
#define YYFINAL 27
/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 1830
+#define YYLAST 1986
/* YYNTOKENS -- Number of terminals. */
#define YYNTOKENS 65
/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS 22
+#define YYNNTS 26
/* YYNRULES -- Number of rules. */
-#define YYNRULES 140
+#define YYNRULES 151
/* YYNSTATES -- Number of states. */
-#define YYNSTATES 275
+#define YYNSTATES 300
/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
by yylex, with out-of-bounds checking. */
@@ -676,8 +676,8 @@ static const yytype_uint8 yytranslate[] =
0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 56, 53, 2, 2,
- 57, 58, 51, 49, 45, 50, 60, 52, 2, 2,
+ 2, 2, 2, 2, 2, 2, 58, 53, 2, 2,
+ 56, 57, 51, 49, 45, 50, 60, 52, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 59, 55,
47, 46, 48, 54, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
@@ -710,20 +710,21 @@ static const yytype_uint8 yytranslate[] =
static const yytype_uint16 yyrline[] =
{
0, 270, 270, 273, 278, 281, 291, 294, 299, 302,
- 307, 311, 316, 321, 326, 331, 334, 339, 343, 347,
- 352, 364, 368, 372, 376, 380, 384, 388, 392, 396,
- 400, 404, 408, 412, 416, 420, 424, 428, 432, 436,
- 440, 444, 448, 452, 456, 460, 464, 468, 473, 482,
- 489, 501, 515, 520, 526, 529, 534, 539, 546, 546,
- 550, 550, 557, 560, 563, 569, 572, 577, 580, 583,
- 589, 592, 595, 603, 607, 610, 613, 616, 619, 622,
- 625, 628, 631, 635, 641, 644, 647, 650, 653, 656,
- 659, 662, 665, 668, 671, 674, 677, 680, 683, 686,
- 689, 696, 700, 704, 716, 721, 722, 723, 724, 727,
- 730, 735, 740, 743, 746, 749, 752, 755, 758, 761,
- 764, 767, 770, 773, 776, 779, 782, 785, 788, 791,
- 796, 799, 800, 801, 804, 807, 810, 813, 817, 821,
- 824
+ 307, 311, 315, 319, 323, 327, 330, 335, 339, 343,
+ 348, 360, 364, 368, 372, 376, 380, 384, 388, 392,
+ 396, 400, 404, 408, 412, 416, 420, 424, 428, 432,
+ 436, 440, 444, 448, 452, 456, 460, 464, 469, 478,
+ 485, 497, 511, 516, 522, 525, 530, 535, 542, 542,
+ 546, 546, 553, 556, 559, 565, 568, 573, 576, 579,
+ 585, 588, 591, 599, 603, 606, 609, 612, 615, 618,
+ 621, 624, 627, 631, 637, 640, 643, 646, 649, 652,
+ 655, 658, 661, 664, 667, 670, 673, 676, 679, 682,
+ 685, 692, 696, 700, 712, 717, 718, 719, 720, 723,
+ 726, 731, 736, 740, 743, 748, 751, 756, 759, 764,
+ 767, 770, 773, 778, 781, 784, 787, 790, 793, 796,
+ 799, 802, 805, 808, 811, 814, 817, 820, 823, 826,
+ 829, 834, 837, 838, 839, 842, 845, 848, 851, 855,
+ 859, 862
};
#endif
@@ -741,11 +742,11 @@ static const char *const yytname[] =
"\"//=\"", "\"<=\"", "\">=\"", "QQSTRING_START", "QQSTRING_TEXT",
"QQSTRING_INTERP_START", "QQSTRING_INTERP_END", "QQSTRING_END", "'|'",
"','", "'='", "'<'", "'>'", "'+'", "'-'", "'*'", "'/'", "'%'", "'?'",
- "';'", "'$'", "'('", "')'", "':'", "'.'", "'['", "']'", "'{'", "'}'",
+ "';'", "'('", "')'", "'$'", "':'", "'.'", "'['", "']'", "'{'", "'}'",
"$accept", "TopLevel", "Module", "Imports", "FuncDefs", "Exp", "Import",
"FuncDef", "Params", "Param", "String", "@1", "@2", "QQString",
- "ElseBody", "ExpD", "Term", "Args", "Arg", "Keyword", "MkDict",
- "MkDictPair", YY_NULLPTR
+ "ElseBody", "ExpD", "Term", "Args", "Arg", "Pattern", "ArrayPats",
+ "ObjPats", "ObjPat", "Keyword", "MkDict", "MkDictPair", YY_NULLPTR
};
#endif
@@ -759,53 +760,55 @@ static const yytype_uint16 yytoknum[] =
275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
295, 296, 297, 298, 124, 44, 61, 60, 62, 43,
- 45, 42, 47, 37, 63, 59, 36, 40, 41, 58,
+ 45, 42, 47, 37, 63, 59, 40, 41, 36, 58,
46, 91, 93, 123, 125
};
# endif
-#define YYPACT_NINF -111
+#define YYPACT_NINF -171
#define yypact_value_is_default(Yystate) \
- (!!((Yystate) == (-111)))
+ (!!((Yystate) == (-171)))
-#define YYTABLE_NINF -131
+#define YYTABLE_NINF -142
#define yytable_value_is_error(Yytable_value) \
- (!!((Yytable_value) == (-131)))
+ (!!((Yytable_value) == (-142)))
/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
STATE-NUM. */
static const yytype_int16 yypact[] =
{
- -11, 775, 40, 27, -7, 7, -111, 15, -111, 51,
- 775, 610, 610, 775, 3, 0, -111, 775, 23, 456,
- 249, 393, 311, 1167, 775, -111, -3, -111, -4, 775,
- 27, 775, -111, -111, -10, 1542, 6, 9, 37, 61,
- -111, 64, -111, -15, -111, -111, 13, 1043, -111, 71,
- 15, 19, 16, -111, 855, -32, 18, -111, -111, -111,
- -111, -111, -111, -111, -111, -111, -111, -111, -111, -111,
- -111, -111, -111, -111, -111, 482, 44, 46, 11, 62,
- 775, 775, 775, 775, 775, 775, 775, 775, 775, 775,
- 775, 775, 775, 775, 775, 775, 775, 775, 775, 775,
- 775, 775, 775, 775, -111, -111, 1696, 56, 55, -4,
- 144, 99, -111, 1696, 775, -111, 1696, -29, -111, -111,
- 4, 775, 543, 57, 58, 569, 72, -111, 1, -111,
- -111, -111, -111, -111, -111, 363, -111, 695, 59, 1074,
- 695, 695, -111, 363, 1758, 306, 306, 1727, 1776, 1012,
- 1758, 1758, 1758, 1758, 1758, 1758, 306, 306, 1696, 1727,
- 1758, 306, 306, -15, -15, 65, 65, 65, -111, 111,
- 68, 63, 775, 69, 809, 20, -111, 775, -111, 5,
- -111, 114, -24, -111, 1214, -111, 1496, 122, 123, -111,
- -111, 775, -111, 775, -111, 83, -111, 695, 85, 2,
- 73, 74, 85, 85, -111, 92, -111, -111, 901, -111,
- 629, 88, 655, 133, -111, -111, -111, 4, 84, -111,
- 775, 775, -111, 87, 89, 1696, 1573, -111, 695, 695,
- 695, 775, 93, 100, 947, -111, -111, 1261, 715, -111,
- 775, 1619, 1665, 775, 775, -111, 85, 85, 85, 1696,
- -111, -111, 101, -111, -111, 1308, 1355, -111, 775, 1402,
- 1449, -111, -111, -111, 1496, 775, 775, -111, 1105, 993,
- -111, 775, -111, 1136, -111
+ 19, 862, 41, 28, 48, -2, -171, 25, -171, 53,
+ 862, 152, 152, 862, 56, 1, -171, 862, 508, 21,
+ 267, 482, 329, 1323, 862, -171, 6, -171, 3, 862,
+ 28, 862, -171, -171, -20, 1698, 8, 10, 81, 73,
+ -171, 111, -171, 9, 59, 1168, -171, -171, -171, 116,
+ 25, 64, 57, -171, 950, -31, 63, -171, -171, -171,
+ -171, -171, -171, -171, -171, -171, -171, -171, -171, -171,
+ -171, -171, -171, -171, -171, 569, 67, 69, 65, 86,
+ 862, 862, 862, 862, 862, 862, 862, 862, 862, 862,
+ 862, 862, 862, 862, 862, 862, 862, 862, 862, 862,
+ 862, 862, 862, 862, -171, -171, 1852, 78, -23, 3,
+ 419, 121, -171, 1852, 862, -171, 1852, -12, -171, -171,
+ 18, 862, 595, -23, -23, 656, 91, -171, 13, -171,
+ -171, -171, -171, -171, -171, 382, -171, 144, 83, 1199,
+ 144, 144, -171, 382, 1914, 324, 324, 1883, 1088, 1932,
+ 1914, 1914, 1914, 1914, 1914, 1914, 324, 324, 1852, 1883,
+ 1914, 324, 324, 9, 9, 84, 84, 84, -171, 137,
+ -23, 1093, 98, 89, 82, 862, 92, 904, 54, -171,
+ 862, -171, 32, -171, 141, -8, -171, 1370, -171, 1652,
+ 97, 99, -171, -171, 862, -171, 862, -171, 109, -171,
+ 144, 117, 50, 103, 104, 117, 117, -171, -171, -171,
+ -14, 105, 862, 106, -18, -171, 108, 862, -171, -171,
+ 996, -171, 682, 114, 742, 165, -171, -171, -171, 18,
+ 112, -171, 862, 862, -171, 862, 862, 1852, 1729, -171,
+ 144, 144, 144, -23, -171, -23, 1230, -23, 1093, -171,
+ -23, 1852, 118, 122, 1042, -171, -171, 1417, 802, -171,
+ 862, 1775, 1821, 1464, 1511, -171, 117, 117, 117, -171,
+ -171, 119, -171, -171, -171, -171, -171, 123, -171, -171,
+ 1558, 1605, -171, 862, 862, 862, -23, -171, -171, -171,
+ 1652, 1261, 1119, -171, -171, -171, 862, -171, 1292, -171
};
/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -817,10 +820,10 @@ static const yytype_uint8 yydefact[] =
0, 0, 0, 0, 0, 0, 58, 0, 0, 0,
0, 0, 0, 0, 0, 95, 47, 1, 0, 8,
6, 0, 75, 60, 0, 0, 0, 0, 18, 0,
- 73, 0, 62, 32, 102, 101, 0, 0, 82, 0,
- 0, 81, 0, 99, 0, 0, 138, 112, 113, 114,
- 115, 116, 117, 118, 119, 120, 121, 122, 123, 124,
- 125, 126, 127, 128, 129, 0, 137, 0, 0, 131,
+ 73, 0, 62, 32, 0, 0, 102, 101, 82, 0,
+ 0, 81, 0, 99, 0, 0, 149, 123, 124, 125,
+ 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
+ 136, 137, 138, 139, 140, 0, 148, 0, 0, 142,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 21, 5, 10, 78, 0, 0,
@@ -830,33 +833,35 @@ static const yytype_uint8 yydefact[] =
0, 0, 100, 0, 40, 41, 42, 25, 24, 23,
27, 31, 34, 36, 39, 26, 45, 46, 28, 29,
22, 43, 44, 30, 33, 35, 37, 38, 74, 0,
- 80, 0, 0, 87, 0, 0, 9, 0, 104, 0,
- 57, 0, 0, 54, 0, 16, 0, 0, 0, 19,
- 17, 0, 63, 0, 59, 0, 133, 0, 134, 69,
- 0, 0, 136, 135, 132, 0, 76, 107, 0, 86,
- 0, 85, 0, 0, 110, 61, 56, 0, 0, 52,
- 0, 0, 15, 0, 0, 20, 0, 68, 0, 0,
- 0, 0, 93, 92, 0, 84, 49, 0, 0, 55,
- 0, 0, 0, 0, 0, 64, 67, 140, 139, 11,
- 90, 89, 91, 50, 48, 0, 0, 66, 0, 0,
- 0, 88, 51, 53, 0, 0, 0, 65, 0, 0,
- 12, 0, 14, 0, 13
+ 0, 0, 0, 80, 0, 0, 87, 0, 0, 9,
+ 0, 104, 0, 57, 0, 0, 54, 0, 16, 0,
+ 0, 0, 19, 17, 0, 63, 0, 59, 0, 144,
+ 0, 145, 69, 0, 0, 147, 146, 143, 112, 115,
+ 0, 0, 0, 0, 0, 117, 0, 0, 76, 107,
+ 0, 86, 0, 85, 0, 0, 110, 61, 56, 0,
+ 0, 52, 0, 0, 15, 0, 0, 20, 0, 68,
+ 0, 0, 0, 0, 113, 0, 0, 0, 0, 114,
+ 0, 11, 93, 92, 0, 84, 49, 0, 0, 55,
+ 0, 0, 0, 0, 0, 64, 67, 151, 150, 116,
+ 119, 0, 121, 118, 120, 90, 89, 91, 50, 48,
+ 0, 0, 66, 0, 0, 0, 0, 88, 51, 53,
+ 0, 0, 0, 122, 65, 12, 0, 14, 0, 13
};
/* YYPGOTO[NTERM-NUM]. */
-static const yytype_int8 yypgoto[] =
+static const yytype_int16 yypgoto[] =
{
- -111, -111, -111, 126, 39, -1, -111, -8, -111, -60,
- -5, -111, -111, 41, -105, -89, -6, -111, -14, -111,
- -110, -111
+ -171, -171, -171, 140, 66, -1, -171, -11, -171, -47,
+ 4, -171, -171, 68, -105, -135, -4, -171, 12, -120,
+ -171, -171, -64, -170, -106, -171
};
/* YYDEFGOTO[NTERM-NUM]. */
static const yytype_int16 yydefgoto[] =
{
- -1, 2, 3, 29, 112, 106, 30, 24, 182, 183,
- 25, 42, 119, 128, 222, 198, 26, 117, 118, 77,
- 78, 79
+ -1, 2, 3, 29, 112, 106, 30, 24, 185, 186,
+ 25, 42, 119, 128, 234, 201, 26, 117, 118, 172,
+ 210, 214, 215, 77, 78, 79
};
/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
@@ -864,314 +869,354 @@ static const yytype_int16 yydefgoto[] =
number is the opposite. If YYTABLE_NINF, syntax error. */
static const yytype_int16 yytable[] =
{
- 23, 40, 107, 50, 1, 36, 37, 107, 180, 35,
- 108, 107, 38, 135, 107, 51, 43, 76, 47, 123,
- 54, 114, 124, 111, 212, 196, 177, 44, 113, 178,
- 116, 217, 136, 204, 218, 16, 101, 102, 103, 104,
- 27, 192, 193, 28, 194, 192, 193, 120, 215, 121,
- 31, 202, 203, 45, 33, 34, 41, 109, 110, 39,
- 181, 32, 109, 110, 125, 126, 109, 110, 127, 109,
- 110, 129, 131, 132, 139, 142, 213, 137, 133, 144,
+ 23, 216, 40, 190, 191, 205, 206, 36, 37, 35,
+ 50, 107, 38, 107, 135, 107, 43, 45, 114, 108,
+ 54, 123, 183, 124, 51, 46, 76, 248, 113, 199,
+ 116, 243, 111, 136, 1, 169, 120, 207, 170, 121,
+ 171, 27, 16, 180, 28, 181, 249, 229, 244, 230,
+ 209, 47, 32, 195, 196, 107, 197, 34, 224, 41,
+ 101, 102, 103, 104, 33, 239, 109, 110, 109, 110,
+ 109, 110, 195, 196, 139, 227, 184, 126, 216, 144,
145, 146, 147, 148, 149, 150, 151, 152, 153, 154,
155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
- 165, 166, 167, 140, 170, 141, 114, 143, 227, 174,
- 168, 169, 175, 187, 188, 205, 191, 200, 216, 104,
- 184, 186, 206, 209, 190, 207, 223, 224, 135, 228,
- 76, 199, 229, 230, 199, 199, 231, 238, 76, 246,
- 247, 248, 235, 240, 243, 171, 244, 250, 4, 5,
- 6, 7, 8, 176, 251, 261, 115, 239, 9, 267,
- 179, 10, 0, 214, 0, 11, 12, 0, 0, 0,
- 13, 208, 14, 15, 0, 0, 116, 0, 0, 0,
- 0, 0, 0, 16, 0, 0, 0, 0, 0, 0,
- 225, 199, 226, 0, 17, 0, 0, 0, 0, 0,
- 18, 19, 0, 172, 20, 21, 173, 22, 0, 234,
- 0, 237, 0, 0, 0, 0, 0, 0, 0, 241,
- 242, 0, 199, 199, 199, 0, 0, 0, 0, 0,
- 249, 0, 0, 0, 0, 0, 0, 255, 0, 256,
- 0, 0, 259, 260, 0, 0, 0, 0, 0, -70,
- 48, 0, 0, 49, -70, 0, 50, 264, -70, -70,
- -70, -70, -70, 0, 268, 269, 0, -70, -70, -70,
- 273, 0, -70, -70, -70, 0, -70, 0, 0, 0,
- -70, -70, -70, -70, -70, -70, -70, -70, 16, 0,
- 0, -70, 0, -70, -70, -70, -70, -70, -70, -70,
- -70, -70, -70, -70, -70, 0, 0, -70, -70, -70,
- -70, -70, 55, -70, 0, 56, -131, -131, 50, 0,
- 0, 0, 0, 0, 57, 58, 59, 60, 61, 62,
- 63, 64, 65, 66, 67, 68, 69, 70, 71, 72,
- 73, 74, 0, -131, -131, 0, 0, 0, 0, 0,
- 16, 0, 0, -131, -131, 99, 100, 101, 102, 103,
- 104, 0, 0, 0, 195, 0, 0, 56, 75, 0,
- 50, 0, 0, 0, 0, -130, 57, 58, 59, 60,
- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
- 71, 72, 73, 74, 52, 0, 0, 4, 5, 6,
- 7, 8, 16, 0, 0, 0, 0, 9, 0, 0,
- 10, 0, 0, 0, 11, 12, 0, 0, 0, 13,
- 75, 14, 15, 0, 0, 0, 0, -130, 0, 0,
- 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 17, 0, 0, 0, 0, 0, 18,
- 19, 0, 0, 20, 21, 53, 22, 46, 0, 0,
+ 165, 166, 167, 114, 31, 266, 267, 268, 125, 177,
+ 109, 110, 225, 173, 39, 127, 129, 131, 132, 133,
+ 187, 189, 137, 269, 193, 270, 140, 272, 141, 142,
+ 274, 143, 168, 202, 178, 194, 202, 202, 104, 76,
+ 203, 208, 217, 218, 219, 228, 221, 76, 4, 5,
+ 6, 7, 8, 235, 135, 236, 4, 5, 6, 7,
+ 8, 240, 241, 242, 245, 247, 293, 250, 255, 258,
+ 115, 260, 275, 15, 220, 213, 276, 287, 286, 116,
+ 179, 15, 259, 16, 273, 294, 0, 182, 0, 0,
+ 0, 16, 226, 237, 200, 238, 202, 0, 0, 0,
+ 18, 0, 19, 0, 20, 21, 0, 22, 18, 0,
+ 19, 246, 20, 21, 0, 22, 251, 0, 0, 0,
+ 0, 254, 0, 257, 0, 0, 0, 0, 0, 0,
+ 0, 261, 262, 0, 263, 264, 202, 202, 202, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 213, 0, 0, 0, 0, 280, 0, 281,
+ 0, 0, 0, 0, 0, 0, 0, -70, 48, 0,
+ 0, 49, -70, 0, 50, 0, -70, -70, -70, -70,
+ -70, 0, 290, 291, 292, -70, -70, -70, 0, 0,
+ -70, -70, -70, 0, -70, 298, 0, 0, -70, -70,
+ -70, -70, -70, -70, -70, -70, 16, 0, 0, -70,
+ 0, -70, -70, -70, -70, -70, -70, -70, -70, -70,
+ -70, -70, -70, 0, -70, 0, -70, -70, -70, -70,
+ 55, -70, 0, 56, -142, -142, 50, 0, 0, 0,
+ 0, 0, 57, 58, 59, 60, 61, 62, 63, 64,
+ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
+ 0, -142, -142, 0, 0, 0, 0, 0, 16, 0,
+ 0, -142, -142, 99, 100, 101, 102, 103, 104, 0,
+ 0, 0, 0, 198, 0, 75, 56, 0, 0, 50,
+ 0, 0, 0, -141, 0, 57, 58, 59, 60, 61,
+ 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
+ 72, 73, 74, 0, 0, 0, 0, 0, 0, 0,
+ 174, 16, 0, 4, 5, 6, 7, 8, 0, 0,
+ 0, 0, 0, 9, 0, 0, 10, 0, 75, 0,
+ 11, 12, 0, 0, 0, 13, -141, 14, 15, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 16, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 17,
+ 0, 0, 0, 0, 0, 18, 0, 19, 175, 20,
+ 21, 176, 22, 52, 0, 0, 4, 5, 6, 7,
+ 8, 0, 0, 0, 0, 0, 9, 0, 0, 10,
+ 0, 0, 0, 11, 12, 0, 0, 0, 13, 44,
+ 14, 15, 4, 5, 6, 7, 8, 0, 0, 0,
+ 0, 16, 9, 0, 0, 10, 0, 0, 0, 11,
+ 12, 0, 17, 0, 13, 0, 14, 15, 18, 0,
+ 19, 0, 20, 21, 53, 22, 0, 16, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 17, 0,
+ 0, 0, 0, 0, 18, 0, 19, 0, 20, 21,
+ 138, 22, 0, 4, 5, 6, 7, 8, 0, 0,
+ 0, 0, 0, 9, 0, 0, 10, 0, 0, 0,
+ 11, 12, 0, 0, 0, 13, 188, 14, 15, 4,
+ 5, 6, 7, 8, 0, 0, 0, 0, 16, 9,
+ 0, 0, 10, 0, 0, 0, 11, 12, 0, 17,
+ 0, 13, 0, 14, 15, 18, 0, 19, 0, 20,
+ 21, 0, 22, 0, 16, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 17, 0, 0, 0, 0,
+ 0, 18, 0, 19, 0, 20, 21, 192, 22, 0,
4, 5, 6, 7, 8, 0, 0, 0, 0, 0,
9, 0, 0, 10, 0, 0, 0, 11, 12, 0,
- 0, 0, 13, 138, 14, 15, 4, 5, 6, 7,
+ 0, 0, 13, 0, 14, 15, 4, 5, 6, 7,
8, 0, 0, 0, 0, 16, 9, 0, 0, 10,
0, 0, 0, 11, 12, 0, 17, 0, 13, 0,
- 14, 15, 18, 19, 0, 0, 20, 21, 0, 22,
+ 14, 15, 18, 0, 19, 0, 20, 21, 0, 22,
0, 16, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 17, 0, 0, 0, 0, 0, 18, 19,
- 0, 0, 20, 21, 185, 22, 0, 4, 5, 6,
- 7, 8, 0, 0, 0, 0, 0, 9, 0, 0,
- 10, 0, 0, 0, 11, 12, 0, 0, 0, 13,
- 189, 14, 15, 4, 5, 6, 7, 8, 0, 0,
- 0, 0, 16, 9, 0, 0, 10, 0, 0, 0,
- 11, 12, 0, 17, 0, 13, 0, 14, 15, 18,
- 19, 0, 0, 20, 21, 0, 22, 0, 16, 0,
- 0, 0, 0, 0, 4, 5, 6, 7, 8, 17,
- 0, 0, 0, 0, 0, 18, 19, 0, 0, 20,
- 21, 0, 22, 4, 5, 6, 7, 8, 0, 15,
- 0, 0, 0, 9, 0, 0, 10, 0, 0, 16,
- 11, 12, 0, 0, 0, 13, 0, 14, 15, 4,
- 5, 6, 7, 8, 0, 0, 18, 19, 16, 9,
- 20, 21, 10, 22, 0, 0, 11, 12, 0, 17,
- 0, 13, 0, 14, 15, 18, 19, 0, 0, 20,
- 21, 233, 22, 0, 16, 0, 0, 0, 0, 4,
- 5, 6, 7, 8, 0, 17, 0, 0, 0, 0,
- 236, 18, 19, 0, 0, 20, 21, 0, 22, 4,
- 5, 6, 7, 8, 15, 0, 0, 0, 0, 9,
- 0, 0, 10, 0, 16, 0, 11, 12, 0, 0,
- 0, 13, 0, 14, 15, 197, 0, 0, 0, 0,
- 0, 18, 19, 0, 16, 20, 21, 0, 22, 0,
- 0, 0, 0, 0, 0, 17, 0, 0, 0, 0,
- 254, 18, 19, 0, 0, 20, 21, 0, 22, 4,
- 5, 6, 7, 8, 0, 0, 0, 0, 0, 9,
- 0, 0, 10, 0, 0, 0, 11, 12, 0, 0,
- 0, 13, 0, 14, 15, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 16, 0, 0, 0, 80, 81,
- 82, 83, 0, 0, 0, 17, 0, 0, 0, 0,
- 0, 18, 19, 84, 85, 20, 21, 0, 22, 0,
+ 0, 0, 17, 0, 0, 0, 0, 0, 18, 0,
+ 19, 0, 20, 21, 253, 22, 4, 5, 6, 7,
+ 8, 0, 0, 0, 0, 0, 9, 0, 0, 10,
+ 0, 0, 0, 11, 12, 0, 0, 0, 13, 0,
+ 14, 15, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 16, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 17, 0, 0, 0, 0, 256, 18, 0,
+ 19, 0, 20, 21, 0, 22, 4, 5, 6, 7,
+ 8, 0, 0, 0, 0, 0, 9, 0, 0, 10,
+ 0, 0, 0, 11, 12, 0, 0, 0, 13, 0,
+ 14, 15, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 16, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 17, 0, 0, 0, 0, 279, 18, 0,
+ 19, 0, 20, 21, 0, 22, 4, 5, 6, 7,
+ 8, 0, 0, 0, 0, 0, 9, 0, 0, 10,
+ 0, 0, 0, 11, 12, 0, 0, 0, 13, 0,
+ 14, 15, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 16, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 17, 80, 81, 82, 83, 0, 18, 0,
+ 19, 0, 20, 21, 0, 22, 0, 0, 84, 85,
+ 0, 0, 0, 0, 0, 86, 87, 88, 89, 90,
+ 91, 92, 93, 0, 0, 0, 0, 0, 94, 95,
+ 96, 97, 98, 99, 100, 101, 102, 103, 104, 80,
+ 81, 82, 83, 222, 0, 0, 223, 0, 0, 0,
+ 0, 0, 0, 0, 84, 85, 0, 0, 0, 0,
+ 0, 86, 87, 88, 89, 90, 91, 92, 93, 0,
+ 0, 0, 0, 0, 94, 95, 96, 97, 98, 99,
+ 100, 101, 102, 103, 104, 80, 81, 82, 83, 0,
+ 0, 0, 134, 0, 0, 0, 0, 0, 0, 0,
+ 84, 85, 0, 0, 0, 0, 0, 86, 87, 88,
+ 89, 90, 91, 92, 93, 0, 0, 0, 0, 0,
+ 94, 95, 96, 97, 98, 99, 100, 101, 102, 103,
+ 104, 80, 81, 82, 83, 0, 0, 0, 252, 0,
+ 0, 0, 0, 0, 0, 0, 84, 85, 0, 0,
+ 0, 0, 0, 86, 87, 88, 89, 90, 91, 92,
+ 93, 0, 0, 0, 0, 0, 94, 95, 96, 97,
+ 98, 99, 100, 101, 102, 103, 104, 211, 81, 82,
+ 50, 0, 0, 0, 277, 0, 57, 58, 59, 60,
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
+ 71, 72, 73, 74, 0, 92, 93, 0, 80, 81,
+ 82, 83, 16, 0, 0, 97, 98, 99, 100, 101,
+ 102, 103, 104, 84, 85, 0, 0, 0, 0, 212,
86, 87, 88, 89, 90, 91, 92, 93, 0, 0,
0, 0, 0, 94, 95, 96, 97, 98, 99, 100,
- 101, 102, 103, 104, 80, 81, 82, 83, 210, 0,
- 0, 211, 0, 0, 0, 0, 0, 0, 0, 84,
- 85, 0, 0, 0, 0, 0, 86, 87, 88, 89,
- 90, 91, 92, 93, 0, 0, 0, 0, 0, 94,
- 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
- 80, 81, 82, 83, 0, 0, 0, 134, 0, 0,
- 0, 0, 0, 0, 0, 84, 85, 0, 0, 0,
+ 101, 102, 103, 104, 296, 0, 297, 80, 81, 82,
+ 83, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 84, 85, 0, 0, 0, 0, 0, 86,
+ 87, 88, 89, 90, 91, 92, 93, 0, 80, 81,
+ 82, 83, 94, 95, 96, 97, 98, 99, 100, 101,
+ 102, 103, 104, 84, 85, 130, 0, 0, 0, 0,
+ 86, 87, 88, 89, 90, 91, 92, 93, 0, 80,
+ 81, 82, 83, 94, 95, 96, 97, 98, 99, 100,
+ 101, 102, 103, 104, 84, 85, 204, 0, 0, 0,
+ 0, 86, 87, 88, 89, 90, 91, 92, 93, 0,
+ 80, 81, 82, 83, 94, 95, 96, 97, 98, 99,
+ 100, 101, 102, 103, 104, 84, 85, 271, 0, 0,
0, 0, 86, 87, 88, 89, 90, 91, 92, 93,
- 0, 0, 0, 0, 0, 94, 95, 96, 97, 98,
- 99, 100, 101, 102, 103, 104, 80, 81, 82, 83,
- 0, 0, 0, 232, 0, 0, 0, 0, 0, 0,
- 0, 84, 85, 0, 0, 0, 0, 0, 86, 87,
- 88, 89, 90, 91, 92, 93, 0, 0, 0, 0,
- 0, 94, 95, 96, 97, 98, 99, 100, 101, 102,
- 103, 104, 80, 81, 82, 83, 0, 0, 0, 252,
- 0, 0, 0, 0, 0, 0, 0, 84, 85, 0,
- 0, 0, 81, 82, 86, 87, 88, 89, 90, 91,
- 92, 93, 0, 0, 0, 0, 84, 94, 95, 96,
- 97, 98, 99, 100, 101, 102, 103, 104, 271, 92,
- 93, 272, 80, 81, 82, 83, 0, 0, 0, 97,
- 98, 99, 100, 101, 102, 103, 104, 84, 85, 0,
+ 0, 80, 81, 82, 83, 94, 95, 96, 97, 98,
+ 99, 100, 101, 102, 103, 104, 84, 85, 295, 0,
+ 0, 0, 0, 86, 87, 88, 89, 90, 91, 92,
+ 93, 0, 80, 81, 82, 83, 94, 95, 96, 97,
+ 98, 99, 100, 101, 102, 103, 104, 84, 85, 299,
0, 0, 0, 0, 86, 87, 88, 89, 90, 91,
- 92, 93, 0, 80, 81, 82, 83, 94, 95, 96,
- 97, 98, 99, 100, 101, 102, 103, 104, 84, 85,
- 0, 130, 0, 0, 0, 86, 87, 88, 89, 90,
- 91, 92, 93, 0, 80, 81, 82, 83, 94, 95,
- 96, 97, 98, 99, 100, 101, 102, 103, 104, 84,
- 85, 0, 201, 0, 0, 0, 86, 87, 88, 89,<