diff options
author | David Tolnay <dtolnay@gmail.com> | 2015-06-07 21:45:14 -0700 |
---|---|---|
committer | Nicolas Williams <nico@cryptonector.com> | 2015-06-09 17:29:48 -0500 |
commit | d3343d5113251abb13b50f415c94d771492edf94 (patch) | |
tree | 3e94c41e765cfa7181a62888d5a4fa988988bcdb | |
parent | 2e96fb2c9bf64b2e39a488ff14b2894b43149bec (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.c | 105 | ||||
-rw-r--r-- | compile.h | 7 | ||||
-rw-r--r-- | docs/content/3.manual/manual.yml | 8 | ||||
-rw-r--r-- | parser.c | 1604 | ||||
-rw-r--r-- | parser.y | 64 | ||||
-rw-r--r-- | tests/all.test | 47 |
6 files changed, 1057 insertions, 778 deletions
@@ -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 @@ -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: | @@ -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,< |