From 6f8bd3047fac5a359c54b56219b776ee7693a646 Mon Sep 17 00:00:00 2001 From: crc Date: Thu, 17 Jun 2021 13:58:50 +0000 Subject: [PATCH] nga-c: non-libc version updated. closes #59 FossilOrigin-Name: e52d8d1976ce3be3dbdc10e92667e629602ae91a8619213a8ff8cc642524ddb0 --- example/retro-edit.retro | 11 +- vm/nga-c-no-libc/image.c | 896 ++++++++++++++++++++------------------- vm/nga-c-no-libc/retro.c | 607 ++++++-------------------- 3 files changed, 598 insertions(+), 916 deletions(-) diff --git a/example/retro-edit.retro b/example/retro-edit.retro index 67c27b3..b7eb0a4 100755 --- a/example/retro-edit.retro +++ b/example/retro-edit.retro @@ -255,6 +255,7 @@ To erase the contents of a line, use `d` followed by the line number. | i | line,text | replace contents of line with text | | e | line | insert text beginning at line, shifting down | + | y | line,text | append text to end of line | I provide two words for editing the text of the file. `i` replaces the text on a line with the provided text, and `e` insterts text, shifting @@ -277,6 +278,14 @@ otherwise blank line to return to the command processing mode. [ @Prompt [ @Prompt call ] if add-space s:get [ store-line ] sip '. s:eq? ] until cleanup ; }} + +:cmd:y + @Input $, s:split/char + s:to-number ed:to-line [ [ n:inc ] dip s:prepend ] sip s:copy ; + +:cmd:Y + @Input $, s:split/char + s:to-number ed:to-line [ [ n:inc ] dip s:append ] sip s:copy ; ~~~ Copy/paste @@ -370,7 +379,7 @@ Use `q` to quit the editor. ## Register The Commands ~~~ -{ ',p#/axdiefwlqnN:*cu [ ] s:for-each } +{ ',p#/axdieyYfwlqnN:*cu [ ] s:for-each } [ [ 'cmd:%c s:format d:lookup d:xt fetch ] sip ed:register-command ] a:for-each ~~~ diff --git a/vm/nga-c-no-libc/image.c b/vm/nga-c-no-libc/image.c index c50ebb7..43ee969 100644 --- a/vm/nga-c-no-libc/image.c +++ b/vm/nga-c-no-libc/image.c @@ -1,62 +1,71 @@ #include #ifndef CELL +#ifndef BIT64 #define CELL int32_t +#define CELL_MIN INT_MIN + 1 +#define CELL_MAX INT_MAX - 1 +#else +#define CELL int64_t +#define CELL_MIN LLONG_MIN + 1 +#define CELL_MAX LLONG_MAX - 1 #endif -CELL ngaImageCells = 9326; -CELL ngaImage[] = { 1793,-1,9308,9325,202104,0,10,1,10,2,10,3,10,4,10,5,10,6,10, - 7,10,8,10,9,10,10,11,10,12,10,13,10,14,10,15,10,16,10,17, - 10,18,10,19,10,20,10,21,10,22,10,23,10,24,10,25,10,68223234,1,2575, - 85000450,1,656912,357,339,268505089,63,62,285281281,0,63,2063,10,101384453,0,9,10,2049,56,25, +#endif +CELL ngaImageCells = 9689; +CELL ngaImage[] = { 1793,9674,9664,9688,202107,379,351,1030,1535,0,10,1,10,2,10,3,10,4,10, + 5,10,6,10,7,10,8,10,11,10,12,10,13,10,14,10,15,10,16,10, + 17,10,18,10,19,10,20,10,21,10,22,10,23,10,24,10,25,68223234,1,2575, + 85000450,1,656912,112,157,268505089,63,62,285281281,0,63,2063,10,101384453,0,9,10,2049,56,25, 459011,76,524546,76,302256641,1,10,16974595,0,50529798,10,25,524547,95,50529798,10,17108738,1,251790353,101777669, 1,17565186,86,524545,90,64,167838467,-1,134287105,3,59,659457,3,459023,107,2049,56,25,2049,107, - 1793,114,2049,114,117506307,0,107,0,524545,25,112,168820993,0,126,1642241,126,134283523,7,112,1793, - 107,7,524545,2049,107,1793,107,16846593,126,141,140,1793,64,16846593,126,112,140,1793,64,7, - 10,659713,1,659713,2,659713,3,1793,168,17108737,3,2,524559,107,2049,107,2049,107,2049,121, - 168820998,2,737,1025,167841793,181,5,17826049,0,181,2,15,25,524546,164,134287105,182,95,2305,183, - 459023,191,134287361,182,186,659201,181,2049,56,25,84152833,48,286458116,10,459014,206,184618754,45,25,16974851, - -1,168886532,1,134284289,1,215,134284289,0,206,660227,32,0,0,112,114,101,102,105,120,58, - 32,0,285278479,232,7,2576,524546,81,1641217,1,167838467,229,2049,245,2049,241,524545,232,201,17826050, - 231,0,2572,2563,2049,222,1793,133,459023,133,17760513,146,3,166,8,251727617,3,2,2049,160, - 16,168820993,-1,126,2049,201,2049,160,459023,133,285282049,3,2,134287105,126,280,524545,1793,107,16846593, - 3,0,107,8,659201,3,524545,25,112,17043201,3,7,2049,112,2049,107,268505092,126,1642241,126, - 656131,659201,3,524545,7,112,2049,107,459009,19,112,459009,54,112,459009,15,112,459009,17,112, - 1793,5,10,524546,160,134284303,162,1807,1025,0,0,1642241,231,285282049,347,1,459012,342,117509889,181, - 342,134287105,347,201,16845825,0,357,339,1793,64,1793,371,17826050,347,251,8,117506305,348,360,64, - 2116,11340,11700,11400,13685,13104,12432,12402,9603,9801,11514,11413,11110,12528,11948,10302,13340,9700,13455,12753, - 10500,10670,12654,13320,11960,13908,10088,10605,11865,11025,0,2049,201,987393,1,1793,107,524546,447,2049, - 445,2049,445,17891588,2,447,8,17045505,-24,-16,17043736,-8,1118488,1793,107,17043202,1,169021201,2049,56, - 25,33883396,101450758,6404,459011,437,34668804,2,2049,434,524545,379,437,302056196,379,659969,1,0,9,152, - 100,117,112,0,456,11,152,100,114,111,112,0,463,13,152,115,119,97,112,0, - 471,21,152,99,97,108,108,0,479,26,152,101,113,63,0,487,28,152,45,101, - 113,63,0,494,30,152,108,116,63,0,502,32,152,103,116,63,0,509,34,152, - 102,101,116,99,104,0,516,36,152,115,116,111,114,101,0,525,38,152,43,0, - 534,40,152,45,0,539,42,152,42,0,544,44,152,47,109,111,100,0,549,46, - 152,97,110,100,0,557,48,152,111,114,0,564,50,152,120,111,114,0,570,52, - 152,115,104,105,102,116,0,577,333,158,112,117,115,104,0,586,336,158,112,111, - 112,0,594,330,158,48,59,0,601,56,146,102,101,116,99,104,45,110,101,120, - 116,0,607,59,146,115,116,111,114,101,45,110,101,120,116,0,621,222,146,115, - 58,116,111,45,110,117,109,98,101,114,0,635,95,146,115,58,101,113,63,0, - 650,81,146,115,58,108,101,110,103,116,104,0,659,64,146,99,104,111,111,115, - 101,0,671,74,152,105,102,0,681,72,146,45,105,102,0,687,262,158,112,114, - 101,102,105,120,58,40,0,694,126,133,67,111,109,112,105,108,101,114,0,706, - 3,133,72,101,97,112,0,718,107,146,44,0,726,121,146,115,44,0,731,127, - 158,59,0,737,289,158,91,0,742,305,158,93,0,747,2,133,68,105,99,116, - 105,111,110,97,114,121,0,752,159,146,100,58,108,105,110,107,0,766,160,146, - 100,58,120,116,0,776,162,146,100,58,99,108,97,115,115,0,784,164,146,100, - 58,110,97,109,101,0,795,146,146,99,108,97,115,115,58,119,111,114,100,0, - 805,158,146,99,108,97,115,115,58,109,97,99,114,111,0,819,133,146,99,108, - 97,115,115,58,100,97,116,97,0,834,166,146,100,58,97,100,100,45,104,101, - 97,100,101,114,0,848,263,158,112,114,101,102,105,120,58,35,0,864,269,158, - 112,114,101,102,105,120,58,58,0,876,283,158,112,114,101,102,105,120,58,38, - 0,888,267,158,112,114,101,102,105,120,58,36,0,900,320,158,114,101,112,101, - 97,116,0,912,322,158,97,103,97,105,110,0,922,369,146,105,110,116,101,114, - 112,114,101,116,0,931,201,146,100,58,108,111,111,107,117,112,0,944,152,146, - 99,108,97,115,115,58,112,114,105,109,105,116,105,118,101,0,956,4,133,86, - 101,114,115,105,111,110,0,975,416,146,105,0,986,107,146,100,0,991,410,146, - 114,0,996,339,146,101,114,114,58,110,111,116,102,111,117,110,100,0,0,0, - 0,0,0,0,0,0,59,0,114,101,0,0,83,0,97,0,107,0,115,0, - 0,0,115,0,0,0,0,0,63,64,91,92,93,94,96,123,124,125,126,0, - 72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,0, + 1793,114,2049,114,117506307,0,107,0,524545,26,112,168820993,0,126,1642241,126,134283523,11,112,1793, + 107,524545,2049,107,1793,107,16846593,126,140,157,1793,64,16846593,126,112,157,1793,64,7,10, + 659713,1,659713,2,659713,3,1793,167,17108737,3,2,524559,107,2049,107,2049,107,2049,121,168820998, + 2,535,1030,167841793,180,9,17826049,0,180,2,15,25,524546,163,134287105,181,95,2305,182,459023, + 190,134287361,181,185,659201,180,10,659969,7,2049,56,25,17694978,58,206,9,84152833,48,319750404,205, + 117507601,208,184618754,45,25,16974851,-1,168886532,1,134284289,1,221,134284289,0,208,660227,32,0,0,115, + 105,103,105,108,58,115,0,285278479,238,6,2576,524546,81,1641217,1,167838467,235,2049,250,2049, + 246,524545,238,200,17826050,237,0,2572,2563,2049,228,1793,133,459023,133,1793,276,17760513,145,3, + 165,8,251727617,3,2,2049,159,16,168820993,-1,126,2049,159,2575,2049,200,17563906,0,290,9, + 1793,133,285282049,3,2,134287105,126,287,524545,1793,107,16846593,3,0,107,8,659201,3,524545,26, + 112,17043201,3,11,2049,112,2049,107,268505092,126,1642241,126,656131,659201,3,524545,11,112,2049,107, + 459009,23,112,459009,55,112,459009,19,112,459009,21,112,1793,9,10,524546,159,134284303,161,1807, + 1030,1642241,237,285282049,359,1,459012,354,117509889,180,354,134287105,359,200,16845825,0,367,351,1793,64, + 1793,381,17826050,359,256,8,117506305,360,370,64,2116,11340,11700,11400,13685,13104,12432,12402,9603,9801, + 11514,11413,11110,12528,11948,10302,13340,9700,13455,12753,10500,10670,12654,13320,11960,13908,10088,10605,11865,11025, + 0,2049,200,987393,1,1793,107,524546,457,2049,455,2049,455,17891588,2,457,8,17045505,-24,-16, + 17043736,-8,1118488,1793,107,17043202,1,169021201,2049,56,25,33883396,101450758,6404,459011,447,34668804,2,2049,444, + 524545,389,447,302056196,389,659969,1,0,13,151,100,117,112,0,466,15,151,100,114,111, + 112,0,473,17,151,115,119,97,112,0,481,25,151,99,97,108,108,0,489,27, + 151,101,113,63,0,497,29,151,45,101,113,63,0,504,31,151,108,116,63,0, + 512,33,151,103,116,63,0,519,35,151,102,101,116,99,104,0,526,37,151,115, + 116,111,114,101,0,535,39,151,43,0,544,41,151,45,0,549,43,151,42,0, + 554,45,151,47,109,111,100,0,559,47,151,97,110,100,0,567,49,151,111,114, + 0,574,51,151,120,111,114,0,580,53,151,115,104,105,102,116,0,587,345,157, + 112,117,115,104,0,596,348,157,112,111,112,0,604,342,157,48,59,0,611,56, + 145,102,101,116,99,104,45,110,101,120,116,0,617,59,145,115,116,111,114,101, + 45,110,101,120,116,0,631,228,145,115,58,116,111,45,110,117,109,98,101,114, + 0,645,95,145,115,58,101,113,63,0,660,81,145,115,58,108,101,110,103,116, + 104,0,669,64,145,99,104,111,111,115,101,0,681,74,151,105,102,0,691,72, + 145,45,105,102,0,697,267,157,115,105,103,105,108,58,40,0,704,126,133,67, + 111,109,112,105,108,101,114,0,715,3,133,72,101,97,112,0,727,107,145,44, + 0,735,121,145,115,44,0,740,127,157,59,0,746,301,157,91,0,751,317,157, + 93,0,756,2,133,68,105,99,116,105,111,110,97,114,121,0,761,158,145,100, + 58,108,105,110,107,0,775,159,145,100,58,120,116,0,785,161,145,100,58,99, + 108,97,115,115,0,793,163,145,100,58,110,97,109,101,0,804,145,145,99,108, + 97,115,115,58,119,111,114,100,0,814,157,145,99,108,97,115,115,58,109,97, + 99,114,111,0,828,133,145,99,108,97,115,115,58,100,97,116,97,0,843,165, + 145,100,58,97,100,100,45,104,101,97,100,101,114,0,857,268,157,115,105,103, + 105,108,58,35,0,873,274,157,115,105,103,105,108,58,58,0,884,293,157,115, + 105,103,105,108,58,38,0,895,272,157,115,105,103,105,108,58,36,0,906,332, + 157,114,101,112,101,97,116,0,917,334,157,97,103,97,105,110,0,927,379,145, + 105,110,116,101,114,112,114,101,116,0,936,200,145,100,58,108,111,111,107,117, + 112,0,949,151,145,99,108,97,115,115,58,112,114,105,109,105,116,105,118,101, + 0,961,4,133,86,101,114,115,105,111,110,0,980,426,145,105,0,991,107,145, + 100,0,996,420,145,114,0,1001,205,133,66,97,115,101,0,1006,351,145,101,114, + 114,58,110,111,116,102,111,117,110,100,0,115,116,111,114,101,0,110,0,101, + 116,0,101,114,118,101,0,115,0,63,0,0,0,63,64,91,92,93,94,96, + 123,124,125,126,0,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86, + 87,88,89,90,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -78,395 +87,412 @@ CELL ngaImage[] = { 1793,-1,9308,9325,202104,0,10,1,10,2,10,3,10,4,10,5,10,6,10, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1001,1543,146, - 69,79,77,0,1,-3,15,10,1536,1556,146,100,101,112,116,104,0,1,-1,15, - 10,1547,1570,146,100,58,108,97,115,116,0,1,2,15,10,1560,1587,146,100,58, - 108,97,115,116,46,120,116,0,2049,1570,2049,160,15,10,1574,1609,146,100,58,108, - 97,115,116,46,99,108,97,115,115,0,2049,1570,2049,162,15,10,1593,1630,146,100, - 58,108,97,115,116,46,110,97,109,101,0,2049,1570,2049,164,10,1615,1646,146,114, - 101,99,108,97,115,115,0,2049,1570,2049,162,16,10,1635,1665,146,105,109,109,101, - 100,105,97,116,101,0,1,158,2049,1646,10,1652,1678,146,100,97,116,97,0,1, - 133,2049,1646,10,1670,1696,146,112,114,105,109,105,116,105,118,101,0,1,152,2049, - 1646,10,1683,1706,158,40,0,10,1701,1712,158,41,0,10,1707,1728,146,99,111,109, - 112,105,108,101,58,108,105,116,0,1,1,2049,107,2049,107,10,1713,1751,146,99, - 111,109,112,105,108,101,58,106,117,109,112,0,1,1793,2049,107,2049,107,10,1735, - 1774,146,99,111,109,112,105,108,101,58,99,97,108,108,0,1,2049,2049,107,2049, - 107,10,1758,1796,146,99,111,109,112,105,108,101,58,114,101,116,0,1,10,2049, - 107,10,1781,1815,146,99,111,109,112,105,108,105,110,103,63,0,1,126,15,10, - 1801,1831,158,112,114,101,102,105,120,58,96,0,2049,222,2049,107,10,1819,1848,158, - 112,114,101,102,105,120,58,92,0,2049,416,10,1836,1863,158,112,114,101,102,105, - 120,58,94,0,2049,410,10,1851,1874,146,104,101,114,101,0,1,3,15,10,1866, - 1890,158,112,114,101,102,105,120,58,64,0,2049,201,2049,160,15,2049,1815,1793,1906, - 1,3841,2049,107,2049,107,10,1,1899,1793,1912,15,10,1,1910,2049,64,10,1878,1929, - 158,112,114,101,102,105,120,58,33,0,2049,201,2049,160,15,2049,1815,1793,1945,1, - 4097,2049,107,2049,107,10,1,1938,1793,1951,16,10,1,1949,2049,64,10,1917,1968,146, - 100,58,99,114,101,97,116,101,0,1,133,1,0,2049,166,2049,1874,2049,1570,2049, - 160,16,10,1956,1991,146,118,97,114,45,110,0,2049,1968,2049,107,10,1982,2003,146, - 118,97,114,0,134284289,0,1991,10,1996,2016,146,99,111,110,115,116,0,2049,1968,2049, - 1570,2049,160,16,10,2007,2032,152,116,117,99,107,0,100926722,10,2024,2042,152,111,118, - 101,114,0,67502597,10,2034,2051,152,110,105,112,0,772,10,2044,2066,152,100,114,111, - 112,45,112,97,105,114,0,771,10,2053,2076,152,63,100,117,112,0,6402,10,2068, - 2090,146,100,117,112,45,112,97,105,114,0,67502597,67502597,10,2078,2100,146,100,105,112, - 0,525572,6,10,2093,2110,146,115,105,112,0,67502597,1,21,2049,2100,10,2103,2122,146, - 98,105,0,1,2110,2049,2100,8,10,2116,2135,146,98,105,42,0,1,2100,2049,2100, - 8,10,2128,2148,146,98,105,64,0,2,2049,2135,10,2141,2159,146,116,114,105,0, - 1793,2168,1,2110,2049,2100,2049,2110,10,1,2161,2049,2100,8,10,2152,2182,146,116,114, - 105,42,0,1793,2199,1793,2192,4,1,2100,2049,2100,10,1,2186,2049,2100,2049,2100,10, - 1,2184,2049,2100,8,10,2174,2213,146,116,114,105,64,0,2,2,2049,2182,10,2205, - 2227,146,119,104,105,108,101,0,1793,2236,525570,1639430,3,1,2229,7,10,1,2229,8, - 3,10,2218,2250,146,117,110,116,105,108,0,1793,2261,525570,385942534,-1,25,3,1,2252, - 7,10,1,2252,8,3,10,2241,2275,146,116,105,109,101,115,0,1793,2287,4,25, - 33886721,1,2053,1542,1,2278,7,10,1,2277,8,3,10,2266,2304,158,112,114,101,102, - 105,120,58,124,0,2049,201,1793,2312,2049,160,15,10,1,2308,1793,2320,2049,162,15, - 10,1,2316,2049,2122,2049,1815,1793,2335,1,133,2049,2100,2049,1774,10,1,2328,1,21, - 2049,64,10,2292,2350,146,84,82,85,69,0,1,-1,10,2342,2362,146,70,65,76, - 83,69,0,1,0,10,2353,2373,146,99,97,115,101,0,1793,2378,67502597,11,10,1, - 2375,2049,2100,4,1793,2390,772,8,2049,2350,10,1,2385,1793,2398,3,2049,2362,10,1, - 2394,2049,64,25,6,3,3,10,2365,2417,146,115,58,99,97,115,101,0,1793,2423, - 67502597,2049,95,10,1,2419,2049,2100,4,1793,2435,772,8,2049,2350,10,1,2430,1793,2443, - 3,2049,2362,10,1,2439,2049,64,25,6,3,3,10,2407,2459,146,110,111,116,0, - 1,-1,23,10,2452,2472,146,108,116,101,113,63,0,2049,2090,101516555,22,10,2463,2486, - 146,103,116,101,113,63,0,4,2049,2472,10,2477,2499,146,110,58,77,65,88,0, - 1,-5,15,10,2490,2512,146,110,58,77,73,78,0,1,-4,15,10,2503,2527,146, - 110,58,122,101,114,111,63,0,1,0,11,10,2516,2543,146,110,58,45,122,101, - 114,111,63,0,1,0,12,10,2531,2562,146,110,58,110,101,103,97,116,105,118, - 101,63,0,1,0,13,10,2547,2581,146,110,58,112,111,115,105,116,105,118,101, - 63,0,1,-1,14,10,2566,2609,146,110,58,115,116,114,105,99,116,108,121,45, - 112,111,115,105,116,105,118,101,63,0,1,0,14,10,2585,2624,146,110,58,101, - 118,101,110,63,0,1,2,20,3,2049,2527,10,2613,2641,146,110,58,111,100,100, - 63,0,2049,2624,2049,2459,10,2631,2653,146,105,102,59,0,67502597,1,74,2049,2100,25, - 6,771,10,2646,2670,146,45,105,102,59,0,67502597,1,72,2049,2100,2049,2459,25,6, - 771,10,2662,2688,152,114,111,116,0,67503109,10,2681,2695,152,47,0,197652,10,2690,2704, - 152,109,111,100,0,788,10,2697,2715,146,110,58,112,111,119,0,1,1,4,1793, - 2723,67502597,19,10,1,2720,2049,2275,772,10,2706,2741,146,110,58,110,101,103,97,116, - 101,0,1,-1,19,10,2729,2757,146,110,58,115,113,117,97,114,101,0,4866,10, - 2745,2769,146,110,58,115,113,114,116,0,1,1,1793,2787,2049,2090,197652,67502597,18,1, - 2,197652,25,17,1,2773,7,10,1,2773,8,772,10,2759,2801,146,110,58,109,105, - 110,0,2049,2090,13,1793,2808,3,10,1,2806,1793,2814,772,10,1,2812,2049,64,10, - 2792,2828,146,110,58,109,97,120,0,2049,2090,14,1793,2835,3,10,1,2833,1793,2841, - 772,10,1,2839,2049,64,10,2819,2855,146,110,58,97,98,115,0,2,2049,2562,1, - 2741,9,10,2846,2873,146,110,58,108,105,109,105,116,0,4,5,2049,2801,6,2049, - 2828,10,2862,2890,146,110,58,105,110,99,0,1,1,17,10,2881,2903,146,110,58, - 100,101,99,0,1,1,18,10,2894,2921,146,110,58,98,101,116,119,101,101,110, - 63,0,67503109,1793,2929,67503109,67503109,2049,2873,10,1,2924,2049,2110,11,10,2907,2947,146,118, - 58,105,110,99,45,98,121,0,1793,2951,4367,10,1,2949,2049,2110,16,10,2935,2969, - 146,118,58,100,101,99,45,98,121,0,1793,2973,1180687,10,1,2971,2049,2110,16,10, - 2957,2988,146,118,58,105,110,99,0,1,1,4,2049,2947,10,2979,3003,146,118,58, - 100,101,99,0,1,1,4,2049,2969,10,2994,3020,146,118,58,108,105,109,105,116, - 0,251790597,1542,2049,2873,4100,10,3009,3034,146,118,58,111,110,0,2049,2350,4100,10,3026, - 3047,146,118,58,111,102,102,0,2049,2362,4100,10,3038,3060,146,97,108,108,111,116, - 0,1,3,2049,2947,10,3051,3079,146,118,58,112,114,101,115,101,114,118,101,0, - 983556,1793,3087,1,21,2049,2100,10,1,3082,2049,2100,4100,10,3065,3105,146,118,58,117, - 112,100,97,116,101,0,4,1793,3112,15,4,8,10,1,3108,2049,2110,16,10,3093, - 3126,146,99,111,112,121,0,1793,3135,285278725,1,33951492,268767489,1,6,10,1,3128,2049,2275, - 771,10,3118,3154,146,83,99,111,112,101,76,105,115,116,0,8821,8932,10,3141,3163, - 146,123,123,0,2049,1570,2,1,3154,2049,59,16,10,3157,3188,146,45,45,45,114, - 101,118,101,97,108,45,45,45,0,2049,1570,1,3154,2049,2890,16,10,3172,3202,146, - 125,125,0,1,3154,2049,56,4,15,11,1793,3216,3841,3154,4097,2,10,1,3211,1793, - 3242,3841,3154,1793,3237,1,2,983567,1,3154,2049,2890,1641487,3,1,3226,7,10,1,3224, - 8,16,10,1,3220,2049,64,10,3196,3256,133,115,116,97,114,116,0,0,10,3247, - 3265,133,101,110,100,0,0,10,3258,3280,146,116,101,114,109,105,110,97,116,101, - 0,1,0,3841,3265,16,10,3196,3302,146,98,117,102,102,101,114,58,115,116,97, - 114,116,0,3841,3256,10,3286,3319,146,98,117,102,102,101,114,58,101,110,100,0, - 3841,3265,10,3305,3336,146,98,117,102,102,101,114,58,97,100,100,0,3841,3265,16, - 1,3265,2049,2988,2049,3280,10,3322,3360,146,98,117,102,102,101,114,58,103,101,116, - 0,1,3265,2049,3003,3841,3265,15,2049,3280,10,3346,3386,146,98,117,102,102,101,114, - 58,101,109,112,116,121,0,3841,3256,4097,3265,2049,3280,10,3370,3408,146,98,117,102, - 102,101,114,58,115,105,122,101,0,3841,3265,3841,3256,18,10,3393,3428,146,98,117, - 102,102,101,114,58,115,101,116,0,4097,3256,2049,3386,10,3414,3452,146,98,117,102, - 102,101,114,58,112,114,101,115,101,114,118,101,0,3841,3256,3841,3265,1793,3465,1, - 21,2049,2100,4097,3256,10,1,3458,2049,2100,4097,3265,10,3433,3487,133,84,101,109,112, - 83,116,114,105,110,103,115,0,32,3472,3505,133,84,101,109,112,83,116,114,105, - 110,103,77,97,120,0,512,3488,3517,146,83,84,82,73,78,71,83,0,2049,1543, - 3841,3487,3841,3505,19,18,10,3506,3537,133,67,117,114,114,101,110,116,0,30,10, - 3526,3552,146,115,58,112,111,105,110,116,101,114,0,3841,3537,3841,3505,19,2049,3517, - 17,10,3539,3571,146,115,58,110,101,120,116,0,1,3537,2049,2988,3841,3537,3841,3487, - 11,1793,3587,1,0,4097,3537,10,1,3582,9,10,3506,3601,146,115,58,116,101,109, - 112,0,2,2049,81,2049,2890,2049,3552,4,2049,3126,2049,3552,2049,3571,10,3591,3627,146, - 115,58,101,109,112,116,121,0,2049,3552,2049,3571,1,0,67502597,16,10,3616,3646,146, - 115,58,115,107,105,112,0,6,1793,3654,68223234,1,786703,0,10,1,3649,2049,2227,2049, - 2903,5,10,3636,3672,146,115,58,107,101,101,112,0,2049,1815,1793,3681,1,3646,2049, - 1774,10,1,3676,9,2049,1874,1,121,2049,2100,2049,133,10,3662,3705,158,112,114,101, - 102,105,120,58,39,0,2049,1815,1,3672,1,3601,2049,64,10,3693,3724,146,115,58, - 99,104,111,112,0,2049,3601,2,2049,81,67502597,17,2049,2903,1,0,4,16,10,3714, - 3751,146,115,58,114,101,118,101,114,115,101,0,1793,3793,2,2049,3601,2049,3428,1, - 81,1793,3769,2,2049,81,17,2049,2903,10,1,3762,2049,2122,4,1793,3783,2,15,2049, - 3336,2049,2903,10,1,3776,2049,2275,3,2049,3302,2049,3601,10,1,3753,2049,3452,10,3738, - 3811,146,115,58,112,114,101,112,101,110,100,0,2049,3601,1793,3835,2,2049,81,17, - 1793,3827,2,2049,81,2049,2890,10,1,3821,2049,2100,4,2049,3126,10,1,3815,2049,2110, - 10,3798,3852,146,115,58,97,112,112,101,110,100,0,4,2049,3811,10,3840,3870,146, - 115,58,102,111,114,45,101,97,99,104,0,1793,3885,67502597,6415,3,67502597,67502597,251987205,2054, - 101777670,1,1,3872,7,10,1,3872,8,771,10,3856,3904,146,115,58,105,110,100,101, - 120,45,111,102,0,4,1793,3918,68223234,1,6415,33883396,101450758,6404,3,1,3907,7,10,1, - 3907,1793,3927,18,2049,2903,772,10,1,3922,1793,3936,2049,81,67502597,11,10,1,3931,2049, - 2159,1793,3946,3,1,-1,10,1,3942,9,10,3890,3970,146,115,58,99,111,110,116, - 97,105,110,115,45,99,104,97,114,63,0,2049,3904,1,-1,12,10,3950,3986,146, - 115,58,104,97,115,104,0,1,5381,4,1793,3994,286458116,33,10,1,3991,2049,3870,10, - 3976,4006,133,83,114,99,0,0,3999,4014,133,84,97,114,0,0,4007,4022,133,80, - 97,100,0,0,4015,4028,133,73,0,0,4023,4034,133,70,0,0,4029,4041,133,65, - 116,0,0,4035,4055,146,116,101,114,109,105,110,97,116,101,0,1,0,3841,4022, - 3841,4014,2049,81,17,16,10,4042,4077,146,101,120,116,114,97,99,116,0,3841,4006, - 3841,4028,17,3841,4022,3841,4014,2049,81,2049,3126,10,4066,4102,146,99,111,109,112,97, - 114,101,0,3841,4022,3841,4014,2049,95,3841,4034,22,4097,4034,3841,4034,1793,4122,3841,4028, - 4097,4041,10,1,4117,2049,72,10,4091,4135,146,110,101,120,116,0,1,4028,2049,2988, - 10,3976,4162,146,115,58,99,111,110,116,97,105,110,115,45,115,116,114,105,110, - 103,63,0,4097,4014,4097,4006,2049,3627,4097,4022,1,0,4097,4028,1,0,4097,4034,3841, - 4006,2049,81,1793,4193,2049,4077,2049,4055,2049,4102,2049,4135,10,1,4184,2049,2275,3841,4034, - 10,4140,4207,133,83,116,114,0,0,4200,4219,146,101,120,116,114,97,99,116,0, - 2049,2090,3841,4207,4,2049,3126,3841,-1,67502597,17,1,0,4,16,10,4208,4244,146,99, - 104,101,99,107,0,1,4219,2049,2100,1793,4255,1,2890,2049,2100,10,1,4250,2049,2100, - 3841,4207,2049,3986,67502597,11,10,4235,4278,146,108,111,99,97,116,105,111,110,0,67503109, - 67503109,1793,4311,1793,4306,4,1793,4292,67502597,2049,2527,21,10,1,4287,2049,2100,4,1793,4302, - 772,2,10,1,4299,9,10,1,4284,2049,2100,10,1,4282,2049,2100,10,4266,4325,146, - 115,101,116,117,112,0,2049,3627,4097,4207,1,0,67503109,67503109,1,81,1,3986,2049,2122, - 2049,3627,2049,3428,1793,4349,67502597,2049,81,10,1,4345,2049,2100,4,10,4140,4376,146,115, - 58,105,110,100,101,120,45,111,102,45,115,116,114,105,110,103,0,67502597,1793,4402, - 1793,4395,2049,4325,1793,4390,2049,4244,2049,4278,10,1,4385,2049,2275,10,1,4381,2049,3452, - 771,3,10,1,4379,2049,2100,18,1,2,18,1,-1,2049,2828,10,4355,4427,146,115, - 58,102,105,108,116,101,114,0,1793,4455,2049,3627,2049,3428,4,1793,4447,2049,2090,4, - 8,1,3336,1,11,2049,64,10,1,4436,2049,3870,3,2049,3302,10,1,4429,2049,3452, - 10,4415,4469,146,115,58,109,97,112,0,1793,4491,2049,3627,2049,3428,4,1793,4483,67502597, - 8,2049,3336,10,1,4478,2049,3870,3,2049,3302,10,1,4471,2049,3452,10,4460,4508,146, - 115,58,115,117,98,115,116,114,0,1793,4514,17,2049,3627,10,1,4510,2049,2100,1793, - 4526,67502597,1,3126,2049,2100,10,1,4520,2049,2110,67502597,1793,4539,17,1,0,4,16,10, - 1,4533,2049,2100,10,4496,4555,146,115,58,114,105,103,104,116,0,67502597,2049,81,67502597, - 18,4,2049,4508,10,4544,4574,146,115,58,108,101,102,116,0,1,0,4,2049,4508, - 10,4564,4598,146,115,58,98,101,103,105,110,115,45,119,105,116,104,63,0,2, - 2049,81,1,13,2049,2100,2049,4574,2049,95,10,4580,4626,146,115,58,101,110,100,115, - 45,119,105,116,104,63,0,2,2049,81,1,13,2049,2100,2049,4555,2049,95,10,4610, - 4648,146,115,58,99,111,112,121,0,67502597,2049,81,2049,2890,2049,3126,10,4638,4668,146, - 115,58,68,73,71,73,84,83,0,2049,3646,48,49,50,51,52,53,54,55,56, - 57,0,1,4670,10,4656,4705,146,115,58,65,83,67,73,73,45,76,79,87,69, - 82,67,65,83,69,0,2049,3646,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,0,1,4707,10,4684,4758, - 146,115,58,65,83,67,73,73,45,85,80,80,69,82,67,65,83,69,0,2049, - 3646,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,0,1,4760,10,4737,4809,146,115,58,65,83,67,73, - 73,45,76,69,84,84,69,82,83,0,2049,3646,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,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,0,1,4811,10,4790,4884,146,115,58,80,85,78,67,84,85,65, - 84,73,79,78,0,2049,3646,95,33,34,35,36,37,38,39,40,41,42,43,44, - 45,46,47,58,59,60,61,62,63,64,91,92,93,94,96,123,124,125,126,0, - 1,4886,1,95,67502597,16,10,4867,4942,133,115,58,87,72,73,84,69,83,80,65, - 67,69,0,32,9,10,13,0,4926,4952,158,39,0,1,3627,2049,146,10,4947,4962, - 158,36,0,1,0,2049,133,10,4957,0,133,65,83,67,73,73,58,78,85,76, - 0,4967,27,133,65,83,67,73,73,58,69,83,67,0,4980,8,133,65,83,67, - 73,73,58,66,83,0,4993,9,133,65,83,67,73,73,58,72,84,0,5005,10, - 133,65,83,67,73,73,58,76,70,0,5017,11,133,65,83,67,73,73,58,86, - 84,0,5029,12,133,65,83,67,73,73,58,70,70,0,5041,13,133,65,83,67, - 73,73,58,67,82,0,5053,32,133,65,83,67,73,73,58,83,80,65,67,69, - 0,5065,127,133,65,83,67,73,73,58,68,69,76,0,5080,1,133,65,83,67, - 73,73,58,83,79,72,0,5093,2,133,65,83,67,73,73,58,83,84,88,0, - 5106,3,133,65,83,67,73,73,58,69,84,88,0,5119,4,133,65,83,67,73, - 73,58,69,79,84,0,5132,5,133,65,83,67,73,73,58,69,78,81,0,5145, - 6,133,65,83,67,73,73,58,65,67,75,0,5158,7,133,65,83,67,73,73, - 58,66,69,76,0,5171,14,133,65,83,67,73,73,58,83,79,0,5184,15,133, - 65,83,67,73,73,58,83,73,0,5196,16,133,65,83,67,73,73,58,68,76, - 69,0,5208,17,133,65,83,67,73,73,58,68,67,49,0,5221,18,133,65,83, - 67,73,73,58,68,67,50,0,5234,19,133,65,83,67,73,73,58,68,67,51, - 0,5247,20,133,65,83,67,73,73,58,68,67,52,0,5260,21,133,65,83,67, - 73,73,58,78,65,75,0,5273,22,133,65,83,67,73,73,58,83,89,78,0, - 5286,23,133,65,83,67,73,73,58,69,84,66,0,5299,24,133,65,83,67,73, - 73,58,67,65,78,0,5312,25,133,65,83,67,73,73,58,69,77,0,5325,26, - 133,65,83,67,73,73,58,83,85,66,0,5337,28,133,65,83,67,73,73,58, - 70,83,0,5350,29,133,65,83,67,73,73,58,71,83,0,5362,30,133,65,83, - 67,73,73,58,82,83,0,5374,31,133,65,83,67,73,73,58,85,83,0,5386, - 5414,146,99,58,108,111,119,101,114,99,97,115,101,63,0,1,97,1,122,2049, - 2921,10,5398,5437,146,99,58,117,112,112,101,114,99,97,115,101,63,0,1,65, - 1,90,2049,2921,10,5421,5457,146,99,58,108,101,116,116,101,114,63,0,1,5414, - 1,5437,2049,2122,22,10,5444,5477,146,99,58,100,105,103,105,116,63,0,1,48, - 1,57,2049,2921,10,5465,5498,146,99,58,118,105,115,105,98,108,101,63,0,1, - 32,1,126,2049,2921,10,5484,5517,146,99,58,118,111,119,101,108,63,0,2049,3646, - 97,101,105,111,117,65,69,73,79,85,0,1,5519,4,2049,3970,10,5505,5552,146, - 99,58,99,111,110,115,111,110,97,110,116,63,0,2,2049,5457,1793,5562,2049,5517, - 2049,2459,10,1,5557,1793,5570,3,2049,2362,10,1,5566,2049,64,10,5536,5592,146,99, - 58,119,104,105,116,101,115,112,97,99,101,63,0,1,4942,4,2049,3970,10,5575, - 5615,146,99,58,45,108,111,119,101,114,99,97,115,101,63,0,2049,5414,2049,2459, - 10,5598,5637,146,99,58,45,117,112,112,101,114,99,97,115,101,63,0,2049,5437, - 2049,2459,10,5620,5655,146,99,58,45,100,105,103,105,116,63,0,2049,5477,2049,2459, - 10,5642,5678,146,99,58,45,119,104,105,116,101,115,112,97,99,101,63,0,2049, - 5592,2049,2459,10,5660,5698,146,99,58,45,118,105,115,105,98,108,101,63,0,2049, - 5498,2049,2459,10,5683,5716,146,99,58,45,118,111,119,101,108,63,0,2049,5517,2049, - 2459,10,5703,5738,146,99,58,45,99,111,110,115,111,110,97,110,116,63,0,2049, - 5552,2049,2459,10,5721,5757,146,99,58,116,111,45,117,112,112,101,114,0,2,2049, - 5414,25,3,1,32,18,10,5743,5780,146,99,58,116,111,45,108,111,119,101,114, - 0,2,2049,5437,25,3,1,32,17,10,5766,5804,146,99,58,116,111,45,115,116, - 114,105,110,103,0,2049,3646,46,0,1,5806,2049,3601,1,36,2049,2110,10,5789,5834, - 146,99,58,116,111,103,103,108,101,45,99,97,115,101,0,2,2049,5414,1,5757, - 1,5780,2049,64,10,5817,5859,146,99,58,116,111,45,110,117,109,98,101,114,0, - 2,2049,5477,1793,5868,1,48,18,10,1,5864,1793,5876,3,1,0,10,1,5872,2049, - 64,10,5844,5895,146,115,58,116,111,45,117,112,112,101,114,0,1,5757,2049,4469, - 10,5881,5914,146,115,58,116,111,45,108,111,119,101,114,0,1,5780,2049,4469,10, - 5900,5934,146,115,58,116,114,105,109,45,108,101,102,116,0,2049,3601,1793,5948,2049, - 56,1,5592,1,2543,2049,2122,21,10,1,5938,2049,2227,2049,2903,10,5919,5971,146,115, - 58,116,114,105,109,45,114,105,103,104,116,0,2049,3601,2049,3751,2049,5934,2049,3751, - 10,5955,5990,146,115,58,116,114,105,109,0,2049,5971,2049,5934,10,5980,6006,146,99, - 111,114,114,101,99,116,0,2,1,48,13,1793,6021,1,48,67502597,18,1,2,19, - 17,10,1,6012,9,10,5980,6040,146,110,58,116,111,45,115,116,114,105,110,103, - 0,1793,6088,2049,1874,2049,3428,2,2049,2855,1793,6066,1,10,20,4,1,48,17,2049, - 6006,2049,3336,2,2049,2543,10,1,6051,2049,2227,3,2049,2562,1793,6080,1,45,2049,3336, - 10,1,6075,9,2049,3302,2049,3751,10,1,6042,2049,3452,10,6025,6115,133,82,101,119, - 114,105,116,101,85,110,100,101,114,115,99,111,114,101,115,0,-1,6093,6123,146, - 115,117,98,0,1,95,1793,6130,1,32,10,1,6127,2049,2373,10,6116,6146,146,114, - 101,119,114,105,116,101,0,3841,6115,1793,6155,1,6123,2049,4469,10,1,6150,9,10, - 6135,6169,146,104,97,110,100,108,101,0,1,3705,8,10,6093,6185,158,112,114,101, - 102,105,120,58,39,0,2049,6146,2049,6169,10,6173,6201,146,115,58,115,112,108,105, - 116,0,2049,2090,2049,3904,772,2049,2090,2049,4574,1,38,2049,2100,10,6190,6236,146,115, - 58,115,112,108,105,116,45,111,110,45,115,116,114,105,110,103,0,2049,2090,2049, - 4376,2049,2890,772,2049,2090,2049,4574,1,38,2049,2100,10,6215,6265,146,115,58,114,101, - 112,108,97,99,101,0,67502597,2049,81,2049,1874,16,1793,6281,2049,6236,4,2049,1874,15, - 17,10,1,6273,2049,2100,2049,3811,2049,3852,10,6252,6302,133,83,112,108,105,116,45, - 79,110,0,0,6290,6313,146,109,97,116,99,104,63,0,3841,6302,11,10,6303,6330, - 146,116,101,114,109,105,110,97,116,101,0,1,0,67502597,2049,2903,16,10,6317,6345, - 146,115,116,101,112,0,1,2890,2049,2100,2049,6313,1793,6359,2,2049,107,2049,6330,10, - 1,6353,9,10,6252,6377,146,115,58,116,111,107,101,110,105,122,101,0,4097,6302, - 2049,3672,2049,1874,1,0,2049,107,1793,6399,2,2049,107,2,1,6345,2049,3870,3,10, - 1,6389,2049,2100,2049,1874,67502597,18,2049,2903,67502597,16,10,6363,6422,133,78,101,101,100, - 108,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1014,1543,145, + 69,79,77,0,1,-3,15,10,1536,1556,145,100,101,112,116,104,0,1,-1,15, + 10,1547,1570,145,100,58,108,97,115,116,0,1,2,15,10,1560,1587,145,100,58, + 108,97,115,116,46,120,116,0,2049,1570,2049,159,15,10,1574,1609,145,100,58,108, + 97,115,116,46,99,108,97,115,115,0,2049,1570,2049,161,15,10,1593,1630,145,100, + 58,108,97,115,116,46,110,97,109,101,0,2049,1570,2049,163,10,1615,1646,145,114, + 101,99,108,97,115,115,0,2049,1570,2049,161,16,10,1635,1665,145,105,109,109,101, + 100,105,97,116,101,0,1,157,2049,1646,10,1652,1678,145,100,97,116,97,0,1, + 133,2049,1646,10,1670,1696,145,112,114,105,109,105,116,105,118,101,0,1,151,2049, + 1646,10,1683,1709,157,104,111,111,107,0,1,1793,2049,107,1,3,15,1,1,17, + 2049,107,10,1701,1734,145,115,101,116,45,104,111,111,107,0,1,1,17,16,10, + 1722,1749,145,117,110,104,111,111,107,0,1,1,17,2,1,1,17,4,16,10, + 1739,1764,157,40,0,10,1759,1770,157,41,0,10,1765,1786,145,99,111,109,112,105, + 108,101,58,108,105,116,0,1,1,2049,107,2049,107,10,1771,1809,145,99,111,109, + 112,105,108,101,58,106,117,109,112,0,1,1793,2049,107,2049,107,10,1793,1832,145, + 99,111,109,112,105,108,101,58,99,97,108,108,0,1,2049,2049,107,2049,107,10, + 1816,1854,145,99,111,109,112,105,108,101,58,114,101,116,0,1,10,2049,107,10, + 1839,1873,145,99,111,109,112,105,108,105,110,103,63,0,1,126,15,10,1859,1888, + 157,115,105,103,105,108,58,96,0,2049,228,2049,107,10,1877,1904,157,115,105,103, + 105,108,58,92,0,2049,426,10,1893,1918,157,115,105,103,105,108,58,94,0,2049, + 420,10,1907,1929,145,104,101,114,101,0,1,3,15,10,1921,1944,157,115,105,103, + 105,108,58,64,0,2049,200,2049,159,15,2049,1873,1793,1960,1,3841,2049,107,2049,107, + 10,1,1953,1793,1966,15,10,1,1964,2049,64,10,1933,1982,157,115,105,103,105,108, + 58,33,0,2049,200,2049,159,15,2049,1873,1793,1998,1,4097,2049,107,2049,107,10,1, + 1991,1793,2004,16,10,1,2002,2049,64,10,1971,2021,145,100,58,99,114,101,97,116, + 101,0,1793,2023,1,133,1,0,2049,165,2049,1929,2049,1570,2049,159,16,10,2009,2046, + 145,118,97,114,45,110,0,2049,2021,2049,107,10,2037,2058,145,118,97,114,0,134284289, + 0,2046,10,2051,2071,145,99,111,110,115,116,0,2049,2021,2049,1570,2049,159,16,10, + 2062,2087,151,116,117,99,107,0,100926722,10,2079,2097,151,111,118,101,114,0,67502597,10, + 2089,2106,151,110,105,112,0,772,10,2099,2121,151,100,114,111,112,45,112,97,105, + 114,0,771,10,2108,2131,151,63,100,117,112,0,6402,10,2123,2145,145,100,117,112, + 45,112,97,105,114,0,67502597,67502597,10,2133,2155,145,100,105,112,0,525572,6,10,2148, + 2165,145,115,105,112,0,67502597,1,25,2049,2155,10,2158,2177,145,98,105,0,1,2165, + 2049,2155,8,10,2171,2190,145,98,105,42,0,1,2155,2049,2155,8,10,2183,2203,145, + 98,105,64,0,2,2049,2190,10,2196,2214,145,116,114,105,0,1793,2223,1,2165,2049, + 2155,2049,2165,10,1,2216,2049,2155,8,10,2207,2237,145,116,114,105,42,0,1793,2254, + 1793,2247,4,1,2155,2049,2155,10,1,2241,2049,2155,2049,2155,10,1,2239,2049,2155,8, + 10,2229,2268,145,116,114,105,64,0,2,2,2049,2237,10,2260,2282,145,119,104,105, + 108,101,0,1793,2291,525570,1639430,3,1,2284,7,10,1,2284,8,3,10,2273,2305,145, + 117,110,116,105,108,0,1793,2316,525570,385942534,-1,25,3,1,2307,7,10,1,2307,8, + 3,10,2296,2330,145,116,105,109,101,115,0,1793,2342,4,25,33886721,1,2053,1542,1, + 2333,7,10,1,2332,8,3,10,2321,2358,157,115,105,103,105,108,58,124,0,2049, + 200,1793,2366,2049,159,15,10,1,2362,1793,2374,2049,161,15,10,1,2370,2049,2177,2049, + 1873,1793,2389,1,133,2049,2155,2049,1832,10,1,2382,1,25,2049,64,10,2347,2404,145, + 84,82,85,69,0,1,-1,10,2396,2416,145,70,65,76,83,69,0,1,0,10, + 2407,2427,145,99,97,115,101,0,1793,2432,67502597,11,10,1,2429,2049,2155,4,1793,2444, + 772,8,2049,2404,10,1,2439,1793,2452,3,2049,2416,10,1,2448,2049,64,25,6,3, + 3,10,2419,2471,145,115,58,99,97,115,101,0,1793,2477,67502597,2049,95,10,1,2473, + 2049,2155,4,1793,2489,772,8,2049,2404,10,1,2484,1793,2497,3,2049,2416,10,1,2493, + 2049,64,25,6,3,3,10,2461,2513,145,110,111,116,0,1,-1,23,10,2506,2526, + 145,108,116,101,113,63,0,2049,2145,101516555,22,10,2517,2540,145,103,116,101,113,63, + 0,4,2049,2526,10,2531,2553,145,110,58,77,65,88,0,1,-5,15,10,2544,2566, + 145,110,58,77,73,78,0,1,-4,15,10,2557,2581,145,110,58,122,101,114,111, + 63,0,1,0,11,10,2570,2597,145,110,58,45,122,101,114,111,63,0,1,0, + 12,10,2585,2616,145,110,58,110,101,103,97,116,105,118,101,63,0,1,0,13, + 10,2601,2635,145,110,58,112,111,115,105,116,105,118,101,63,0,1,-1,14,10, + 2620,2663,145,110,58,115,116,114,105,99,116,108,121,45,112,111,115,105,116,105, + 118,101,63,0,1,0,14,10,2639,2678,145,110,58,101,118,101,110,63,0,1, + 2,20,3,2049,2581,10,2667,2695,145,110,58,111,100,100,63,0,2049,2678,2049,2513, + 10,2685,2707,145,105,102,59,0,67502597,1,74,2049,2155,25,6,771,10,2700,2724,145, + 45,105,102,59,0,67502597,1,72,2049,2155,2049,2513,25,6,771,10,2716,2742,157,105, + 102,58,0,1,25,2049,107,1,3,2049,107,10,2735,2759,157,45,105,102,58,0, + 1,1644289,2049,107,1,-1,2049,107,1,3,2049,107,10,2751,2779,151,114,111,116,0, + 67503109,10,2772,2786,151,47,0,197652,10,2781,2795,151,109,111,100,0,788,10,2788,2806, + 145,110,58,112,111,119,0,1,1,4,1793,2814,67502597,19,10,1,2811,2049,2330,772, + 10,2797,2832,145,110,58,110,101,103,97,116,101,0,1,-1,19,10,2820,2848,145, + 110,58,115,113,117,97,114,101,0,4866,10,2836,2860,145,110,58,115,113,114,116, + 0,1,1,1793,2878,2049,2145,197652,67502597,18,1,2,197652,25,17,1,2864,7,10,1, + 2864,8,772,10,2850,2892,145,110,58,109,105,110,0,2049,2145,13,1793,2899,3,10, + 1,2897,1793,2905,772,10,1,2903,2049,64,10,2883,2919,145,110,58,109,97,120,0, + 2049,2145,14,1793,2926,3,10,1,2924,1793,2932,772,10,1,2930,2049,64,10,2910,2946, + 145,110,58,97,98,115,0,2,2049,2616,1,2832,9,10,2937,2964,145,110,58,108, + 105,109,105,116,0,4,5,2049,2892,6,2049,2919,10,2953,2981,145,110,58,105,110, + 99,0,659713,1,10,2972,2993,145,110,58,100,101,99,0,659969,1,10,2984,3010,145, + 110,58,98,101,116,119,101,101,110,63,0,67503109,1793,3018,67503109,67503109,2049,2964,10,1, + 3013,2049,2165,11,10,2996,3036,145,118,58,105,110,99,45,98,121,0,1793,3040,4367, + 10,1,3038,2049,2165,16,10,3024,3058,145,118,58,100,101,99,45,98,121,0,1793, + 3062,1180687,10,1,3060,2049,2165,16,10,3046,3077,145,118,58,105,110,99,0,1,1, + 4,2049,3036,10,3068,3092,145,118,58,100,101,99,0,1,1,4,2049,3058,10,3083, + 3109,145,118,58,108,105,109,105,116,0,251790597,1542,2049,2964,4100,10,3098,3123,145,118, + 58,111,110,0,2049,2404,4100,10,3115,3136,145,118,58,111,102,102,0,2049,2416,4100, + 10,3127,3149,145,97,108,108,111,116,0,1,3,2049,3036,10,3140,3168,145,118,58, + 112,114,101,115,101,114,118,101,0,983556,1793,3176,1,25,2049,2155,10,1,3171,2049, + 2155,4100,10,3154,3194,145,118,58,117,112,100,97,116,101,0,4,1793,3201,15,4, + 8,10,1,3197,2049,2165,16,10,3182,3215,145,99,111,112,121,0,1793,3224,285278725,1, + 33951492,268767489,1,6,10,1,3217,2049,2330,771,10,3207,3243,145,83,99,111,112,101,76, + 105,115,116,0,9480,9578,10,3230,3252,145,123,123,0,2049,1570,2,1,3243,2049,59, + 16,10,3246,3277,145,45,45,45,114,101,118,101,97,108,45,45,45,0,2049,1570, + 1,3243,2049,2981,16,10,3261,3291,145,125,125,0,1,3243,2049,56,4,15,11,1793, + 3305,3841,3243,4097,2,10,1,3300,1793,3331,3841,3243,1793,3326,1,2,983567,1,3243,2049, + 2981,1641487,3,1,3315,7,10,1,3313,8,16,10,1,3309,2049,64,10,3285,3345,133, + 115,116,97,114,116,0,0,10,3336,3354,133,101,110,100,0,0,10,3347,3369,145, + 116,101,114,109,105,110,97,116,101,0,1,0,3841,3354,16,10,3285,3391,145,98, + 117,102,102,101,114,58,115,116,97,114,116,0,3841,3345,10,3375,3408,145,98,117, + 102,102,101,114,58,101,110,100,0,3841,3354,10,3394,3425,145,98,117,102,102,101, + 114,58,97,100,100,0,3841,3354,16,1,3354,2049,3077,2049,3369,10,3411,3449,145,98, + 117,102,102,101,114,58,103,101,116,0,1,3354,2049,3092,3841,3354,15,2049,3369,10, + 3435,3475,145,98,117,102,102,101,114,58,101,109,112,116,121,0,3841,3345,4097,3354, + 2049,3369,10,3459,3497,145,98,117,102,102,101,114,58,115,105,122,101,0,3841,3354, + 3841,3345,18,10,3482,3517,145,98,117,102,102,101,114,58,115,101,116,0,4097,3345, + 2049,3475,10,3503,3541,145,98,117,102,102,101,114,58,112,114,101,115,101,114,118, + 101,0,3841,3345,3841,3354,1793,3554,1,25,2049,2155,4097,3345,10,1,3547,2049,2155,4097, + 3354,10,3522,3576,133,84,101,109,112,83,116,114,105,110,103,115,0,32,3561,3594, + 133,84,101,109,112,83,116,114,105,110,103,77,97,120,0,512,3577,3606,145,83, + 84,82,73,78,71,83,0,2049,1543,3841,3576,3841,3594,19,18,10,3595,3626,133,67, + 117,114,114,101,110,116,0,31,10,3615,3641,145,115,58,112,111,105,110,116,101, + 114,0,3841,3626,3841,3594,19,2049,3606,17,10,3628,3660,145,115,58,110,101,120,116, + 0,1,3626,2049,3077,3841,3626,3841,3576,11,1793,3676,1,0,4097,3626,10,1,3671,9, + 10,3595,3690,145,115,58,116,101,109,112,0,2,2049,81,2049,2981,2049,3641,4,2049, + 3215,2049,3641,2049,3660,10,3680,3716,145,115,58,101,109,112,116,121,0,2049,3641,2049, + 3660,1,0,67502597,16,10,3705,3735,145,115,58,115,107,105,112,0,6,1793,3743,68223234, + 1,786703,0,10,1,3738,2049,2282,2049,2993,5,10,3725,3761,145,115,58,107,101,101, + 112,0,2049,1873,1793,3770,1,3735,2049,1832,10,1,3765,9,2049,1929,1,121,2049,2155, + 2049,133,10,3751,3793,157,115,105,103,105,108,58,39,0,2049,1873,1,3761,1,3690, + 2049,64,10,3782,3812,145,115,58,99,104,111,112,0,2049,3690,2,2049,81,67502597,17, + 2049,2993,1,0,4,16,10,3802,3839,145,115,58,114,101,118,101,114,115,101,0, + 1793,3881,2,2049,3690,2049,3517,1,81,1793,3857,2,2049,81,17,2049,2993,10,1,3850, + 2049,2177,4,1793,3871,2,15,2049,3425,2049,2993,10,1,3864,2049,2330,3,2049,3391,2049, + 3690,10,1,3841,2049,3541,10,3826,3899,145,115,58,112,114,101,112,101,110,100,0, + 2049,3690,1793,3923,2,2049,81,17,1793,3915,2,2049,81,2049,2981,10,1,3909,2049,2155, + 4,2049,3215,10,1,3903,2049,2165,10,3886,3940,145,115,58,97,112,112,101,110,100, + 0,4,2049,3899,10,3928,3958,145,115,58,102,111,114,45,101,97,99,104,0,1793, + 3973,67502597,6415,3,67502597,67502597,251987205,2054,101777670,1,1,3960,7,10,1,3960,8,771,10,3944, + 3994,145,115,58,105,110,100,101,120,47,99,104,97,114,0,4,1793,4008,68223234,1, + 6415,33883396,101450758,6404,3,1,3997,7,10,1,3997,1793,4017,18,2049,2993,772,10,1,4012, + 1793,4026,2049,81,67502597,11,10,1,4021,2049,2214,1793,4036,3,1,-1,10,1,4032,9, + 10,3978,4060,145,115,58,99,111,110,116,97,105,110,115,47,99,104,97,114,63, + 0,2049,3994,1,-1,12,10,4040,4076,145,115,58,104,97,115,104,0,1,5381,4, + 1793,4084,286458116,33,10,1,4081,2049,3958,10,4066,4096,133,83,114,99,0,0,4089,4104, + 133,84,97,114,0,0,4097,4112,133,80,97,100,0,0,4105,4118,133,73,0,0, + 4113,4124,133,70,0,0,4119,4131,133,65,116,0,0,4125,4145,145,116,101,114,109, + 105,110,97,116,101,0,1,0,3841,4112,3841,4104,2049,81,17,16,10,4132,4167,145, + 101,120,116,114,97,99,116,0,3841,4096,3841,4118,17,3841,4112,3841,4104,2049,81,2049, + 3215,10,4156,4192,145,99,111,109,112,97,114,101,0,3841,4112,3841,4104,2049,95,3841, + 4124,22,4097,4124,3841,4124,1793,4212,3841,4118,4097,4131,10,1,4207,2049,72,10,4181,4225, + 145,110,101,120,116,0,1,4118,2049,3077,10,4066,4252,145,115,58,99,111,110,116, + 97,105,110,115,47,115,116,114,105,110,103,63,0,4097,4104,4097,4096,2049,3716,4097, + 4112,1,0,4097,4118,1,0,4097,4124,3841,4096,2049,81,1793,4283,2049,4167,2049,4145,2049, + 4192,2049,4225,10,1,4274,2049,2330,3841,4124,10,4230,4297,133,83,116,114,0,0,4290, + 4309,145,101,120,116,114,97,99,116,0,2049,2145,3841,4297,4,2049,3215,3841,-1,67502597, + 17,1,0,4,16,10,4298,4334,145,99,104,101,99,107,0,1,4309,2049,2155,1793, + 4345,1,2981,2049,2155,10,1,4340,2049,2155,3841,4297,2049,4076,67502597,11,10,4325,4368,145, + 108,111,99,97,116,105,111,110,0,67503109,67503109,1793,4401,1793,4396,4,1793,4382,67502597,2049, + 2581,21,10,1,4377,2049,2155,4,1793,4392,772,2,10,1,4389,9,10,1,4374,2049, + 2155,10,1,4372,2049,2155,10,4356,4415,145,115,101,116,117,112,0,2049,3716,4097,4297, + 1,0,67503109,67503109,1,81,1,4076,2049,2177,2049,3716,2049,3517,1793,4439,67502597,2049,81,10, + 1,4435,2049,2155,4,10,4230,4463,145,115,58,105,110,100,101,120,47,115,116,114, + 105,110,103,0,67502597,1793,4489,1793,4482,2049,4415,1793,4477,2049,4334,2049,4368,10,1,4472, + 2049,2330,10,1,4468,2049,3541,771,3,10,1,4466,2049,2155,18,1,2,18,1,-1, + 2049,2919,10,4445,4514,145,115,58,102,105,108,116,101,114,0,1793,4542,2049,3716,2049, + 3517,4,1793,4534,2049,2145,4,8,1,3425,1,15,2049,64,10,1,4523,2049,3958,3, + 2049,3391,10,1,4516,2049,3541,10,4502,4556,145,115,58,109,97,112,0,1793,4578,2049, + 3716,2049,3517,4,1793,4570,67502597,8,2049,3425,10,1,4565,2049,3958,3,2049,3391,10,1, + 4558,2049,3541,10,4547,4595,145,115,58,115,117,98,115,116,114,0,1793,4601,17,2049, + 3716,10,1,4597,2049,2155,1793,4613,67502597,1,3215,2049,2155,10,1,4607,2049,2165,67502597,1793, + 4626,17,1,0,4,16,10,1,4620,2049,2155,10,4583,4642,145,115,58,114,105,103, + 104,116,0,67502597,2049,81,67502597,18,4,2049,4595,10,4631,4661,145,115,58,108,101,102, + 116,0,1,0,4,2049,4595,10,4651,4685,145,115,58,98,101,103,105,110,115,45, + 119,105,116,104,63,0,2,2049,81,1,17,2049,2155,2049,4661,2049,95,10,4667,4713, + 145,115,58,101,110,100,115,45,119,105,116,104,63,0,2,2049,81,1,17,2049, + 2155,2049,4642,2049,95,10,4697,4735,145,115,58,99,111,112,121,0,67502597,2049,81,2049, + 2981,2049,3215,10,4725,4755,145,115,58,68,73,71,73,84,83,0,2049,3735,48,49, + 50,51,52,53,54,55,56,57,65,66,67,68,69,70,0,1,4757,10,4743,4798, + 145,115,58,65,83,67,73,73,45,76,79,87,69,82,67,65,83,69,0,2049, + 3735,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,0,1,4800,10,4777,4851,145,115,58,65,83,67,73, + 73,45,85,80,80,69,82,67,65,83,69,0,2049,3735,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, + 0,1,4853,10,4830,4902,145,115,58,65,83,67,73,73,45,76,69,84,84,69, + 82,83,0,2049,3735,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,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,0,1,4904, + 10,4883,4977,145,115,58,80,85,78,67,84,85,65,84,73,79,78,0,2049,3735, + 95,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,58,59,60,61, + 62,63,64,91,92,93,94,96,123,124,125,126,0,1,4979,1,95,67502597,16,10, + 4960,5035,133,115,58,87,72,73,84,69,83,80,65,67,69,0,32,9,10,13, + 0,5019,5045,157,39,0,1,3716,2049,145,10,5040,5055,157,36,0,1,0,2049,133, + 10,5050,0,133,65,83,67,73,73,58,78,85,76,0,5060,27,133,65,83,67, + 73,73,58,69,83,67,0,5073,8,133,65,83,67,73,73,58,66,83,0,5086, + 9,133,65,83,67,73,73,58,72,84,0,5098,10,133,65,83,67,73,73,58, + 76,70,0,5110,11,133,65,83,67,73,73,58,86,84,0,5122,12,133,65,83, + 67,73,73,58,70,70,0,5134,13,133,65,83,67,73,73,58,67,82,0,5146, + 32,133,65,83,67,73,73,58,83,80,65,67,69,0,5158,127,133,65,83,67, + 73,73,58,68,69,76,0,5173,1,133,65,83,67,73,73,58,83,79,72,0, + 5186,2,133,65,83,67,73,73,58,83,84,88,0,5199,3,133,65,83,67,73, + 73,58,69,84,88,0,5212,4,133,65,83,67,73,73,58,69,79,84,0,5225, + 5,133,65,83,67,73,73,58,69,78,81,0,5238,6,133,65,83,67,73,73, + 58,65,67,75,0,5251,7,133,65,83,67,73,73,58,66,69,76,0,5264,14, + 133,65,83,67,73,73,58,83,79,0,5277,15,133,65,83,67,73,73,58,83, + 73,0,5289,16,133,65,83,67,73,73,58,68,76,69,0,5301,17,133,65,83, + 67,73,73,58,68,67,49,0,5314,18,133,65,83,67,73,73,58,68,67,50, + 0,5327,19,133,65,83,67,73,73,58,68,67,51,0,5340,20,133,65,83,67, + 73,73,58,68,67,52,0,5353,21,133,65,83,67,73,73,58,78,65,75,0, + 5366,22,133,65,83,67,73,73,58,83,89,78,0,5379,23,133,65,83,67,73, + 73,58,69,84,66,0,5392,24,133,65,83,67,73,73,58,67,65,78,0,5405, + 25,133,65,83,67,73,73,58,69,77,0,5418,26,133,65,83,67,73,73,58, + 83,85,66,0,5430,28,133,65,83,67,73,73,58,70,83,0,5443,29,133,65, + 83,67,73,73,58,71,83,0,5455,30,133,65,83,67,73,73,58,82,83,0, + 5467,31,133,65,83,67,73,73,58,85,83,0,5479,5507,145,99,58,108,111,119, + 101,114,99,97,115,101,63,0,1,97,1,122,2049,3010,10,5491,5530,145,99,58, + 117,112,112,101,114,99,97,115,101,63,0,1,65,1,90,2049,3010,10,5514,5550, + 145,99,58,108,101,116,116,101,114,63,0,1,5507,1,5530,2049,2177,22,10,5537, + 5570,145,99,58,100,105,103,105,116,63,0,1,48,1,57,2049,3010,10,5558,5591, + 145,99,58,118,105,115,105,98,108,101,63,0,1,32,1,126,2049,3010,10,5577, + 5610,145,99,58,118,111,119,101,108,63,0,2049,3735,97,101,105,111,117,65,69, + 73,79,85,0,1,5612,4,2049,4060,10,5598,5645,145,99,58,99,111,110,115,111, + 110,97,110,116,63,0,2,2049,5550,1793,5655,2049,5610,2049,2513,10,1,5650,1793,5663, + 3,2049,2416,10,1,5659,2049,64,10,5629,5685,145,99,58,119,104,105,116,101,115, + 112,97,99,101,63,0,1,5035,4,2049,4060,10,5668,5708,145,99,58,45,108,111, + 119,101,114,99,97,115,101,63,0,2049,5507,2049,2513,10,5691,5730,145,99,58,45, + 117,112,112,101,114,99,97,115,101,63,0,2049,5530,2049,2513,10,5713,5748,145,99, + 58,45,100,105,103,105,116,63,0,2049,5570,2049,2513,10,5735,5771,145,99,58,45, + 119,104,105,116,101,115,112,97,99,101,63,0,2049,5685,2049,2513,10,5753,5791,145, + 99,58,45,118,105,115,105,98,108,101,63,0,2049,5591,2049,2513,10,5776,5809,145, + 99,58,45,118,111,119,101,108,63,0,2049,5610,2049,2513,10,5796,5831,145,99,58, + 45,99,111,110,115,111,110,97,110,116,63,0,2049,5645,2049,2513,10,5814,5850,145, + 99,58,116,111,45,117,112,112,101,114,0,2,2049,5507,25,3,1,32,18,10, + 5836,5873,145,99,58,116,111,45,108,111,119,101,114,0,2,2049,5530,25,3,1, + 32,17,10,5859,5897,145,99,58,116,111,45,115,116,114,105,110,103,0,2049,3735, + 46,0,1,5899,2049,3690,1,37,2049,2165,10,5882,5927,145,99,58,116,111,103,103, + 108,101,45,99,97,115,101,0,2,2049,5507,1,5850,1,5873,2049,64,10,5910,5952, + 145,99,58,116,111,45,110,117,109,98,101,114,0,2,2049,5570,1793,5961,1,48, + 18,10,1,5957,1793,5969,3,1,0,10,1,5965,2049,64,10,5937,5988,145,115,58, + 116,111,45,117,112,112,101,114,0,1,5850,2049,4556,10,5974,6007,145,115,58,116, + 111,45,108,111,119,101,114,0,1,5873,2049,4556,10,5993,6027,145,115,58,116,114, + 105,109,45,108,101,102,116,0,2049,3690,1793,6041,2049,56,1,5685,1,2597,2049,2177, + 21,10,1,6031,2049,2282,2049,2993,10,6012,6064,145,115,58,116,114,105,109,45,114, + 105,103,104,116,0,2049,3690,2049,3839,2049,6027,2049,3839,10,6048,6083,145,115,58,116, + 114,105,109,0,2049,6064,2049,6027,10,6073,6110,133,82,101,119,114,105,116,101,85, + 110,100,101,114,115,99,111,114,101,115,0,-1,6088,6118,145,115,117,98,0,1, + 95,1793,6125,1,32,10,1,6122,2049,2427,10,6111,6141,145,114,101,119,114,105,116, + 101,0,3841,6110,1793,6150,1,6118,2049,4556,10,1,6145,9,10,6130,6164,145,104,97, + 110,100,108,101,0,1,3793,8,10,6088,6179,157,115,105,103,105,108,58,39,0, + 2049,6141,2049,6164,10,6168,6200,145,115,58,115,112,108,105,116,47,99,104,97,114, + 0,2049,2145,2049,3994,772,2049,2145,2049,4661,1,39,2049,2155,10,6184,6232,145,115,58, + 115,112,108,105,116,47,115,116,114,105,110,103,0,2049,2145,2049,4463,2049,2981,772, + 2049,2145,2049,4661,1,39,2049,2155,10,6214,6261,145,115,58,114,101,112,108,97,99, + 101,0,67502597,2049,81,2049,1929,16,1793,6277,2049,6232,4,2049,1929,15,17,10,1,6269, + 2049,2155,2049,3899,2049,3940,10,6248,6298,133,83,112,108,105,116,45,79,110,0,0, + 6286,6309,145,109,97,116,99,104,63,0,3841,6298,11,10,6299,6326,145,116,101,114, + 109,105,110,97,116,101,0,1,0,67502597,2049,2993,16,10,6313,6341,145,115,116,101, + 112,0,1,2981,2049,2155,2049,6309,1793,6355,2,2049,107,2049,6326,10,1,6349,9,10, + 6248,6373,145,115,58,116,111,107,101,110,105,122,101,0,4097,6298,2049,3761,2049,1929, + 1,0,2049,107,1793,6395,2,2049,107,2,1,6341,2049,3958,3,10,1,6385,2049,2155, + 2049,1929,67502597,18,2049,2993,67502597,16,10,6359,6418,133,78,101,101,100,108,101,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,6412,6557,133,76,101,110,0,0,6550, - 6568,133,84,111,107,101,110,115,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,6408,6553,133,76,101,110,0,0,6546,6564,133,84,111, + 107,101,110,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6558,6702,133, - 84,80,0,0,6696,6711,146,115,97,118,101,0,2049,3672,3841,6702,1,6568,17,2049, - 2890,16,1,6702,2049,2988,10,6703,6734,146,110,101,120,116,0,1793,6740,3841,6557,17, - 10,1,6736,2049,2110,10,6726,6754,146,100,111,110,101,63,0,2049,81,2049,2527,10, - 6363,6783,146,115,58,116,111,107,101,110,105,122,101,45,111,110,45,115,116,114, - 105,110,103,0,1,0,4097,6702,1793,6797,2,1,6422,2049,4648,2049,3852,10,1,6789, - 1793,6806,2049,81,4097,6557,10,1,6801,2049,2122,1793,6823,1,6422,2049,6236,2049,6711,2049, - 6734,2049,6754,10,1,6812,2049,2250,1,6568,3841,6702,2049,2903,4097,6568,10,6759,6848,146, - 102,111,114,45,101,97,99,104,0,4,2049,56,1,13,2049,2100,1793,6864,5,2049, - 56,84018692,525572,1542,10,1,6857,2049,2275,771,10,6836,6884,146,115,117,98,115,116,105, - 116,117,116,101,0,2049,3517,1,129,18,10,6870,6901,146,101,120,116,114,97,99, - 116,0,2049,6884,2049,4648,10,6890,6918,146,116,111,107,101,110,105,122,101,0,2049, - 6783,2049,3627,10,6906,6934,146,99,111,109,98,105,110,101,0,2049,6884,2049,3852,2049, - 3852,10,6923,6950,146,109,101,114,103,101,0,4,1,6934,2049,6848,772,10,6941,6969, - 146,102,105,110,100,45,101,110,100,0,2,2049,81,2049,6884,2049,81,18,67502597,17, - 10,6957,6989,146,99,108,101,97,110,0,2049,6969,1,0,4,16,10,6759,7013,146, - 115,58,114,101,112,108,97,99,101,45,97,108,108,0,1,3,1793,7028,2049,6901, - 2049,6918,2049,6950,2049,6989,2049,3601,10,1,7017,2049,3079,10,6996,7041,146,99,104,97, - 114,0,1,32,1793,7050,1,95,2049,3336,10,1,7045,2049,2373,1,114,1793,7063,1, - 13,2049,3336,10,1,7058,2049,2373,1,110,1793,7076,1,10,2049,3336,10,1,7071,2049, - 2373,1,116,1793,7089,1,9,2049,3336,10,1,7084,2049,2373,1,48,1793,7102,1,0, - 2049,3336,10,1,7097,2049,2373,1,94,1793,7115,1,27,2049,3336,10,1,7110,2049,2373, - 2049,3336,10,7033,7130,146,116,121,112,101,0,1,99,1793,7138,4,2049,3336,10,1, - 7134,2049,2373,1,115,1793,7152,4,1,3336,2049,3870,10,1,7146,2049,2373,1,110,1793, - 7168,4,2049,6040,1,3336,2049,3870,10,1,7160,2049,2373,3,10,7122,7184,146,104,97, - 110,100,108,101,0,1,92,1793,7193,2049,56,2049,7041,10,1,7188,2049,2373,1,37, - 1793,7206,2049,56,2049,7130,10,1,7201,2049,2373,2049,3336,10,6996,7225,146,115,58,102, - 111,114,109,97,116,0,1793,7254,2049,3627,1793,7249,2049,3428,1793,7244,2049,56,25,2049, - 7184,1,7235,7,10,1,7235,8,3,10,1,7231,2049,2110,10,1,7227,2049,3452,10, - 7213,7270,146,115,58,99,111,110,115,116,0,1,3672,2049,2100,2049,2016,10,7259,7287, - 133,86,97,108,117,101,115,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7277,7323,146,102, - 114,111,109,0,2049,81,2,1793,7341,1793,7334,1,7287,4113,10,1,7330,2049,2110,2049, - 2903,10,1,7328,2049,2275,3,10,7315,7353,146,116,111,0,2,2049,81,1793,7369,2049, - 56,1,97,18,2049,2890,1,7287,266001,10,1,7358,2049,2275,3,10,7259,7386,146,114, - 101,111,114,100,101,114,0,1,7323,2049,2100,2049,7353,10,7375,7402,146,99,117,114, - 114,121,0,2049,1874,1793,7412,4,2049,1728,2049,1751,10,1,7406,2049,2100,10,7393,7425, - 146,100,111,101,115,0,2049,1587,4,2049,7402,2049,1570,2049,160,16,1,146,2049,1646, - 10,7417,7454,146,100,58,102,111,114,45,101,97,99,104,0,1,2,1793,7480,6415, - 2049,2090,1793,7472,1793,7467,2052,10,1,7465,2049,2100,10,1,7463,2049,2100,1,7458,7, - 10,1,7458,8,3,10,7440,7500,146,100,58,108,111,111,107,117,112,45,120,116, - 0,1,0,4,1793,7525,2049,2090,2049,160,2831,1793,7518,4,1,2051,2049,2100,10,1, - 7512,1,11,2049,64,10,1,7505,2049,7454,3,10,7485,7543,146,97,58,108,101,110, - 103,116,104,0,15,10,7531,7566,146,97,58,99,111,117,110,116,101,100,45,114, - 101,115,117,108,116,115,0,8,2049,1874,1793,7579,2,2049,107,1,107,2049,2275,10, - 1,7571,2049,2100,10,7545,7601,146,97,58,102,114,111,109,45,115,116,114,105,110, - 103,0,2049,1874,1793,7615,2,2049,81,2049,107,1,107,2049,3870,10,1,7605,2049,2100, - 10,7584,7634,146,97,58,102,111,114,45,101,97,99,104,0,4,2049,56,1,13, - 2049,2100,1793,7650,5,2049,56,84018692,525572,1542,10,1,7643,2049,2275,771,10,7620,7665,146, - 97,58,100,117,112,0,2049,1874,1793,7678,2,15,2049,107,1,107,2049,7634,10,1, - 7669,2049,2100,10,7656,7693,146,97,58,99,111,112,121,0,1,3,1793,7709,4097,3, - 2,2049,7543,2049,107,1,107,2049,7634,10,1,7697,2049,3079,10,7683,7729,146,97,58, - 116,111,45,115,116,114,105,110,103,0,1,3,1793,7742,2049,7665,1,0,2049,107, - 2049,2890,10,1,7733,2049,3079,2049,3601,10,7714,7761,146,97,58,97,112,112,101,110, - 100,0,2049,2090,1,34,2049,2148,17,2049,1874,1793,7786,2049,107,1793,7781,1,107,2049, - 7634,10,1,7776,2049,2148,10,1,7772,2049,2100,10,7749,7804,146,97,58,112,114,101, - 112,101,110,100,0,4,2049,7761,10,7791,7818,146,97,58,99,104,111,112,0,2049, - 7665,1,-1,2049,3060,2,2049,3003,10,7808,7840,146,97,58,102,105,108,116,101,114, - 0,1793,7855,67502597,1,21,2049,2100,4,1,107,1,11,2049,64,10,1,7842,2049,7402, - 2049,1874,1793,7870,67502597,15,2049,107,2049,7634,10,1,7863,2049,2100,2049,1874,67502597,18,2049, - 2903,67502597,16,10,7828,7898,146,97,58,99,111,110,116,97,105,110,115,63,0,1, - 0,4,1793,7910,4,5,67502597,11,6,22,10,1,7903,2049,7634,772,10,7883,7938,146, - 97,58,99,111,110,116,97,105,110,115,45,115,116,114,105,110,103,63,0,1, - 0,4,1793,7951,4,5,67502597,2049,95,6,22,10,1,7943,2049,7634,772,10,7916,7966, - 146,97,58,109,97,112,0,1793,7972,8,2049,107,10,1,7968,2049,7402,2049,1874,1793, - 7987,67502597,15,2049,107,2049,7634,10,1,7980,2049,2100,10,7957,8005,146,97,58,114,101, - 118,101,114,115,101,0,2049,1874,1793,8039,2049,56,1793,8017,17,2049,2903,10,1,8013, - 2049,2110,2,2049,107,1793,8033,2,15,2049,107,2049,2903,10,1,8026,2049,2275,3,10, - 1,8009,2049,2100,10,7992,8052,146,97,58,116,104,0,17,2049,2890,10,8044,8067,146, - 97,58,102,101,116,99,104,0,2049,8052,15,10,8056,8082,146,97,58,115,116,111, - 114,101,0,2049,8052,16,10,8071,8098,146,97,58,114,101,100,117,99,101,0,1, - 13,2049,2100,2049,7634,10,8086,8117,146,105,100,101,110,116,105,102,121,0,1,-1, - 4,1,0,1793,8148,2049,2350,11,1793,8142,67502597,1,-1,11,1793,8138,772,2,10,1, - 8135,9,10,1,8129,9,2049,2890,10,1,8124,2049,8098,3,10,8086,8168,146,97,58, - 105,110,100,101,120,45,111,102,0,1,3,1793,8181,1,26,2049,7402,2049,7966,2049, - 8117,10,1,8172,2049,3079,10,8154,8207,146,97,58,105,110,100,101,120,45,111,102, - 45,115,116,114,105,110,103,0,1,3,1793,8220,1,95,2049,7402,2049,7966,2049,8117, - 10,1,8211,2049,3079,10,8186,8235,146,97,58,109,97,107,101,0,2049,7566,2,2, - 1,3,1793,8246,2049,8005,10,1,8243,2049,3079,4,2049,7693,10,8225,8259,158,123,0, - 1,289,2049,158,1,1556,2049,146,1,289,2049,158,10,8254,8277,158,125,0,1,305, - 2049,158,1,2100,2049,146,1,1556,2049,146,1,13,2049,152,1,40,2049,152,1,2903, - 2049,146,1,305,2049,158,1,8235,2049,146,10,8272,8321,146,98,111,117,110,100,115, - 63,0,67502597,2049,7543,67502597,13,10,8310,8335,146,99,111,112,121,0,2049,56,2049,107, - 10,8327,8350,146,116,111,45,101,110,100,0,2,2049,7543,17,2049,2890,10,8272,8367, - 146,97,58,108,101,102,116,0,2049,8321,1793,8375,771,1,-1,10,1,8371,2049,2653, - 2049,1874,67502597,2049,107,1793,8396,1,2890,2049,2100,1,8335,2049,2275,3,10,1,8386,2049, - 2100,10,8357,8412,146,97,58,114,105,103,104,116,0,2049,8321,1793,8420,771,1,-1, - 10,1,8416,2049,2653,2049,1874,67502597,2049,107,1793,8443,4,2049,8350,67502597,18,4,1,8335, - 2049,2275,3,10,1,8431,2049,2100,10,8401,8460,146,97,58,109,105,100,100,108,101, - 0,1,2042,2049,2100,4,67502597,2049,8321,1793,8475,771,3,1,-1,10,1,8470,2049,2653, - 771,2049,2090,4,18,2049,2890,2049,1874,67502597,2049,107,1793,8510,772,1793,8500,17,2049,2890, - 10,1,8496,2049,2100,1,8335,2049,2275,3,10,1,8493,2049,2100,10,8448,8523,133,70, - 108,97,103,0,0,8515,8535,146,99,111,109,112,97,114,101,0,67440386,184946434,10,8524, - 8548,146,108,101,110,103,116,104,0,659202,10,8538,8558,146,110,101,120,116,0,17043713, - 1,1,2577,10,8550,8576,146,110,111,116,45,101,113,117,97,108,0,50529030,2561,0, - 10,8563,8588,146,108,111,111,112,0,524549,8558,2049,8535,18157313,8523,8523,16,420610310,1,1, - 8588,7,10,8448,8611,146,97,58,101,113,63,0,1048833,-1,8523,2049,8535,151066369,-1,8576, - 2049,8548,2049,8588,251724547,8523,10,8602,8636,146,97,58,45,101,113,63,0,2049,8611,2049, - 2459,10,8626,8659,146,97,58,98,101,103,105,110,115,45,119,105,116,104,63,0, - 1,3,1793,8675,2,2049,7543,1,13,2049,2100,2049,8367,2049,8611,10,1,8663,2049,3079, - 10,8641,8696,146,97,58,101,110,100,115,45,119,105,116,104,63,0,1,3,1793, - 8712,2,2049,7543,1,13,2049,2100,2049,8412,2049,8611,10,1,8700,2049,3079,10,8680,8733, - 146,99,117,114,114,101,110,116,45,108,105,110,101,0,2049,3517,1,1025,18,10, - 8717,8755,146,99,111,117,110,116,45,116,111,107,101,110,115,0,1793,8761,1,32, - 11,10,1,8757,2049,4427,2049,81,10,8739,8786,146,112,114,111,99,101,115,115,45, - 116,111,107,101,110,115,0,1793,8814,1,32,2049,6201,4,1793,8807,2,2049,81,2049, - 2543,1,369,1,11,2049,64,10,1,8795,2049,2100,2049,2890,10,1,8788,2049,2275,2049, - 369,10,8680,8835,146,115,58,101,118,97,108,117,97,116,101,0,2049,8733,2049,4648, - 2049,8733,2,2049,8755,2049,8786,10,8821,8853,133,76,80,0,0,8847,8863,133,73,110, - 100,101,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8854,8903,146,110, - 101,120,116,0,3841,8853,1,8863,17,2049,2988,10,8895,8919,146,112,114,101,112,0, - 1,8853,2049,2988,1,0,3841,8853,1,8863,17,16,10,8911,8940,146,100,111,110,101, - 0,1,8853,2049,3003,10,8821,8950,146,73,0,3841,8853,1,8863,17,15,10,8945,8962, - 146,74,0,3841,8853,1,8863,17,2049,2903,15,10,8957,8976,146,75,0,3841,8853,1, - 8863,17,1,2,18,15,10,8971,9003,146,105,110,100,101,120,101,100,45,116,105, - 109,101,115,0,2049,8919,4,1793,9019,25,33886721,1,2053,1542,2049,8903,1,9008,7,10, - 1,9008,8,3,2049,8940,10,8986,9034,158,104,111,111,107,0,2049,3646,108,105,106, - 117,46,46,46,46,0,1,9036,2049,416,2049,1874,2049,2890,2049,107,10,9026,9068,146, - 115,101,116,45,104,111,111,107,0,2049,2890,16,10,9056,9082,146,117,110,104,111, - 111,107,0,2049,2890,2,2049,2890,4,16,10,9072,9106,146,105,111,58,101,110,117, - 109,101,114,97,116,101,0,27,10,9090,9120,146,105,111,58,113,117,101,114,121, - 0,28,10,9108,9135,146,105,111,58,105,110,118,111,107,101,0,29,10,9122,9152, - 146,105,111,58,115,99,97,110,45,102,111,114,0,1,-1,4,2049,9106,1793,9183, - 2049,8950,2049,9120,772,67502597,11,1793,9179,1793,9174,3,2049,8950,10,1,9170,2049,2100,10, - 1,9168,9,10,1,9159,2049,9003,3,10,9137,9198,146,99,58,112,117,116,0,1793, - 9200,1,0,2049,9135,10,9189,9211,146,110,108,0,1,10,2049,9198,10,9205,9222,146, - 115,112,0,1,32,2049,9198,10,9216,9234,146,116,97,98,0,1,9,2049,9198,10, - 9227,9248,146,115,58,112,117,116,0,1,9198,2049,3870,10,9239,9262,146,110,58,112, - 117,116,0,2049,6040,2049,9248,10,9253,9276,146,114,101,115,101,116,0,2049,1556,25, - 771,1,9276,7,10,9267,9298,146,100,117,109,112,45,115,116,97,99,107,0,2049, - 1556,25,134284547,9298,134283782,9262,2049,9222,10,9284,9316,146,70,82,69,69,0,2049,3517,1, - 1025,18,2049,1874,18,10,0 }; + 0,0,0,0,0,0,0,0,0,0,0,0,0,6554,6698,133,84,80,0,0, + 6692,6707,145,115,97,118,101,0,2049,3761,3841,6698,1,6564,17,2049,2981,16,1,6698, + 2049,3077,10,6699,6730,145,110,101,120,116,0,1793,6736,3841,6553,17,10,1,6732,2049, + 2165,10,6722,6750,145,100,111,110,101,63,0,2049,81,2049,2581,10,6359,6779,145,115, + 58,116,111,107,101,110,105,122,101,45,111,110,45,115,116,114,105,110,103,0, + 1,0,4097,6698,1793,6793,2,1,6418,2049,4735,2049,3940,10,1,6785,1793,6802,2049,81, + 4097,6553,10,1,6797,2049,2177,1793,6819,1,6418,2049,6232,2049,6707,2049,6730,2049,6750,10, + 1,6808,2049,2305,1,6564,3841,6698,2049,2993,4097,6564,10,6755,6844,145,102,111,114,45, + 101,97,99,104,0,4,2049,56,1,17,2049,2155,1793,6860,5,2049,56,84018692,525572,1542, + 10,1,6853,2049,2330,771,10,6832,6880,145,115,117,98,115,116,105,116,117,116,101, + 0,2049,3606,1,129,18,10,6866,6897,145,101,120,116,114,97,99,116,0,2049,6880, + 2049,4735,10,6886,6914,145,116,111,107,101,110,105,122,101,0,2049,6779,2049,3716,10, + 6902,6930,145,99,111,109,98,105,110,101,0,2049,6880,2049,3940,2049,3940,10,6919,6946, + 145,109,101,114,103,101,0,4,1,6930,2049,6844,772,10,6937,6965,145,102,105,110, + 100,45,101,110,100,0,2,2049,81,2049,6880,2049,81,18,67502597,17,10,6953,6985,145, + 99,108,101,97,110,0,2049,6965,1,0,4,16,10,6755,7009,145,115,58,114,101, + 112,108,97,99,101,45,97,108,108,0,1,3,1793,7024,2049,6897,2049,6914,2049,6946, + 2049,6985,2049,3690,10,1,7013,2049,3168,10,6992,7039,133,83,116,114,105,110,103,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,7029,7119,145,99,104,101,99,107,45,115,105,103,110,0, + 2049,2616,1793,7128,1,45,2049,3425,10,1,7123,9,10,7105,7144,145,110,45,62,100, + 105,103,105,116,0,2049,4755,17,15,10,7132,7160,145,99,111,110,118,101,114,116, + 0,1793,7174,3841,205,20,4,2049,7144,2049,3425,2,2049,2581,10,1,7162,2049,2305,3, + 10,6992,7195,145,110,58,116,111,45,115,116,114,105,110,103,0,1793,7209,1,7039, + 2049,3517,2,2049,2946,2049,7160,2049,7119,10,1,7197,2049,3541,1,7039,2049,3839,10,7180, + 7226,145,99,104,97,114,0,1,32,1793,7235,1,95,2049,3425,10,1,7230,2049,2427, + 1,114,1793,7248,1,13,2049,3425,10,1,7243,2049,2427,1,110,1793,7261,1,10,2049, + 3425,10,1,7256,2049,2427,1,116,1793,7274,1,9,2049,3425,10,1,7269,2049,2427,1, + 48,1793,7287,1,0,2049,3425,10,1,7282,2049,2427,1,94,1793,7300,1,27,2049,3425, + 10,1,7295,2049,2427,2049,3425,10,7218,7315,145,116,121,112,101,0,1,99,1793,7323, + 4,2049,3425,10,1,7319,2049,2427,1,115,1793,7337,4,1,3425,2049,3958,10,1,7331, + 2049,2427,1,110,1793,7353,4,2049,7195,1,3425,2049,3958,10,1,7345,2049,2427,3,10, + 7307,7369,145,104,97,110,100,108,101,0,1,92,1793,7378,2049,56,2049,7226,10,1, + 7373,2049,2427,1,37,1793,7391,2049,56,2049,7315,10,1,7386,2049,2427,2049,3425,10,7180, + 7410,145,115,58,102,111,114,109,97,116,0,1793,7439,2049,3716,1793,7434,2049,3517,1793, + 7429,2049,56,25,2049,7369,1,7420,7,10,1,7420,8,3,10,1,7416,2049,2165,10, + 1,7412,2049,3541,10,7398,7455,145,115,58,99,111,110,115,116,0,1,3761,2049,2155, + 2049,2071,10,7444,7472,133,86,97,108,117,101,115,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,7462,7508,145,102,114,111,109,0,2049,81,2,1793,7526,1793,7519,1,7472,4113,10, + 1,7515,2049,2165,2049,2993,10,1,7513,2049,2330,3,10,7500,7538,145,116,111,0,2, + 2049,81,1793,7554,2049,56,1,97,18,2049,2981,1,7472,266001,10,1,7543,2049,2330,3, + 10,7444,7571,145,114,101,111,114,100,101,114,0,1,7508,2049,2155,2049,7538,10,7560, + 7587,145,99,117,114,114,121,0,2049,1929,1793,7597,4,2049,1786,2049,1809,10,1,7591, + 2049,2155,10,7578,7610,145,100,111,101,115,0,2049,1587,4,2049,7587,2049,1570,2049,159, + 16,1,145,2049,1646,10,7602,7639,145,100,58,102,111,114,45,101,97,99,104,0, + 1,2,1793,7665,6415,2049,2145,1793,7657,1793,7652,2052,10,1,7650,2049,2155,10,1,7648, + 2049,2155,1,7643,7,10,1,7643,8,3,10,7625,7685,145,100,58,108,111,111,107, + 117,112,45,120,116,0,1,0,4,1793,7710,2049,2145,2049,159,2831,1793,7703,4,1, + 2106,2049,2155,10,1,7697,1,15,2049,64,10,1,7690,2049,7639,3,10,7670,7728,145, + 97,58,108,101,110,103,116,104,0,15,10,7716,7751,145,97,58,99,111,117,110, + 116,101,100,45,114,101,115,117,108,116,115,0,8,2049,1929,1793,7764,2,2049,107, + 1,107,2049,2330,10,1,7756,2049,2155,10,7730,7786,145,97,58,102,114,111,109,45, + 115,116,114,105,110,103,0,2049,1929,1793,7800,2,2049,81,2049,107,1,107,2049,3958, + 10,1,7790,2049,2155,10,7769,7819,145,97,58,102,111,114,45,101,97,99,104,0, + 4,2049,56,1,17,2049,2155,1793,7835,5,2049,56,84018692,525572,1542,10,1,7828,2049,2330, + 771,10,7805,7850,145,97,58,100,117,112,0,2049,1929,1793,7863,2,15,2049,107,1, + 107,2049,7819,10,1,7854,2049,2155,10,7841,7878,145,97,58,99,111,112,121,0,1, + 3,1793,7894,4097,3,2,2049,7728,2049,107,1,107,2049,7819,10,1,7882,2049,3168,10, + 7868,7914,145,97,58,116,111,45,115,116,114,105,110,103,0,1,3,1793,7927,2049, + 7850,1,0,2049,107,2049,2981,10,1,7918,2049,3168,2049,3690,10,7899,7946,145,97,58, + 97,112,112,101,110,100,0,2049,2145,1,35,2049,2203,17,2049,1929,1793,7971,2049,107, + 1793,7966,1,107,2049,7819,10,1,7961,2049,2203,10,1,7957,2049,2155,10,7934,7989,145, + 97,58,112,114,101,112,101,110,100,0,4,2049,7946,10,7976,8003,145,97,58,99, + 104,111,112,0,2049,7850,1,-1,2049,3149,2,2049,3092,10,7993,8025,145,97,58,102, + 105,108,116,101,114,0,1793,8040,67502597,1,25,2049,2155,4,1,107,1,15,2049,64, + 10,1,8027,2049,7587,2049,1929,1793,8055,67502597,15,2049,107,2049,7819,10,1,8048,2049,2155, + 2049,1929,67502597,18,2049,2993,67502597,16,10,8013,8083,145,97,58,99,111,110,116,97,105, + 110,115,63,0,1,0,4,1793,8095,4,5,67502597,11,6,22,10,1,8088,2049,7819, + 772,10,8068,8123,145,97,58,99,111,110,116,97,105,110,115,47,115,116,114,105, + 110,103,63,0,1,0,4,1793,8136,4,5,67502597,2049,95,6,22,10,1,8128,2049, + 7819,772,10,8101,8151,145,97,58,109,97,112,0,1793,8157,8,2049,107,10,1,8153, + 2049,7587,2049,1929,1793,8172,67502597,15,2049,107,2049,7819,10,1,8165,2049,2155,10,8142,8190, + 145,97,58,114,101,118,101,114,115,101,0,2049,1929,1793,8224,2049,56,1793,8202,17, + 2049,2993,10,1,8198,2049,2165,2,2049,107,1793,8218,2,15,2049,107,2049,2993,10,1, + 8211,2049,2330,3,10,1,8194,2049,2155,10,8177,8237,145,97,58,116,104,0,17,2049, + 2981,10,8229,8252,145,97,58,102,101,116,99,104,0,2049,8237,15,10,8241,8267,145, + 97,58,115,116,111,114,101,0,2049,8237,16,10,8256,8283,145,97,58,114,101,100, + 117,99,101,0,1,17,2049,2155,2049,7819,10,8271,8302,145,105,100,101,110,116,105, + 102,121,0,1,-1,4,1,0,1793,8333,2049,2404,11,1793,8327,67502597,1,-1,11,1793, + 8323,772,2,10,1,8320,9,10,1,8314,9,2049,2981,10,1,8309,2049,8283,3,10, + 8271,8350,145,97,58,105,110,100,101,120,0,1,3,1793,8363,1,27,2049,7587,2049, + 8151,2049,8302,10,1,8354,2049,3168,10,8339,8386,145,97,58,105,110,100,101,120,47, + 115,116,114,105,110,103,0,1,3,1793,8399,1,95,2049,7587,2049,8151,2049,8302,10, + 1,8390,2049,3168,10,8368,8414,145,97,58,109,97,107,101,0,2049,7751,2,2,1, + 3,1793,8425,2049,8190,10,1,8422,2049,3168,4,2049,7878,10,8404,8438,157,123,0,1, + 301,2049,157,1,1556,2049,145,1,301,2049,157,10,8433,8456,157,125,0,1,317,2049, + 157,1,2155,2049,145,1,1556,2049,145,1,17,2049,151,1,41,2049,151,1,2993,2049, + 145,1,317,2049,157,1,8414,2049,145,10,8451,8500,145,98,111,117,110,100,115,63, + 0,67502597,2049,7728,67502597,13,10,8489,8514,145,99,111,112,121,0,2049,56,2049,107,10, + 8506,8529,145,116,111,45,101,110,100,0,2,2049,7728,17,2049,2981,10,8451,8546,145, + 97,58,108,101,102,116,0,2049,8500,1793,8554,771,1,-1,10,1,8550,2049,2707,2049, + 1929,67502597,2049,107,1793,8575,1,2981,2049,2155,1,8514,2049,2330,3,10,1,8565,2049,2155, + 10,8536,8591,145,97,58,114,105,103,104,116,0,2049,8500,1793,8599,771,1,-1,10, + 1,8595,2049,2707,2049,1929,67502597,2049,107,1793,8622,4,2049,8529,67502597,18,4,1,8514,2049, + 2330,3,10,1,8610,2049,2155,10,8580,8639,145,97,58,109,105,100,100,108,101,0, + 1,2097,2049,2155,4,67502597,2049,8500,1793,8654,771,3,1,-1,10,1,8649,2049,2707,771, + 2049,2145,4,18,2049,2981,2049,1929,67502597,2049,107,1793,8689,772,1793,8679,17,2049,2981,10, + 1,8675,2049,2155,1,8514,2049,2330,3,10,1,8672,2049,2155,10,8627,8702,133,70,108, + 97,103,0,0,8694,8714,145,99,111,109,112,97,114,101,0,67440386,184946434,10,8703,8727, + 145,108,101,110,103,116,104,0,659202,10,8717,8737,145,110,101,120,116,0,17043713,1, + 1,2577,10,8729,8755,145,110,111,116,45,101,113,117,97,108,0,50529030,2561,0,10, + 8742,8767,145,108,111,111,112,0,524549,8737,2049,8714,18157313,8702,8702,16,420610310,1,1,8767, + 7,10,8627,8790,145,97,58,101,113,63,0,1048833,-1,8702,2049,8714,151066369,-1,8755,2049, + 8727,2049,8767,251724547,8702,10,8781,8815,145,97,58,45,101,113,63,0,2049,8790,2049,2513, + 10,8805,8838,145,97,58,98,101,103,105,110,115,45,119,105,116,104,63,0,1, + 3,1793,8854,2,2049,7728,1,17,2049,2155,2049,8546,2049,8790,10,1,8842,2049,3168,10, + 8820,8875,145,97,58,101,110,100,115,45,119,105,116,104,63,0,1,3,1793,8891, + 2,2049,7728,1,17,2049,2155,2049,8591,2049,8790,10,1,8879,2049,3168,10,8859,8912,145, + 99,117,114,114,101,110,116,45,108,105,110,101,0,2049,3606,1,1025,18,10,8896, + 8934,145,99,111,117,110,116,45,116,111,107,101,110,115,0,1793,8940,1,32,11, + 10,1,8936,2049,4514,2049,81,10,8918,8965,145,112,114,111,99,101,115,115,45,116, + 111,107,101,110,115,0,1793,8993,1,32,2049,6200,4,1793,8986,2,2049,81,2049,2597, + 1,379,1,15,2049,64,10,1,8974,2049,2155,2049,2981,10,1,8967,2049,2330,2049,379, + 10,8859,9014,145,115,58,101,118,97,108,117,97,116,101,0,2049,8912,2049,4735,2049, + 8912,2,2049,8934,2049,8965,10,9000,9032,133,76,80,0,0,9026,9042,133,73,110,100, + 101,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9033,9082,145,110,101, + 120,116,0,3841,9032,1,9042,17,2049,3077,10,9074,9098,145,112,114,101,112,0,1, + 9032,2049,3077,1,0,3841,9032,1,9042,17,16,10,9090,9119,145,100,111,110,101,0, + 1,9032,2049,3092,10,9000,9129,145,73,0,3841,9032,1,9042,17,15,10,9124,9141,145, + 74,0,3841,9032,1,9042,17,2049,2993,15,10,9136,9155,145,75,0,3841,9032,1,9042, + 17,1,2,18,15,10,9150,9182,145,105,110,100,101,120,101,100,45,116,105,109, + 101,115,0,2049,9098,4,1793,9198,25,33886721,1,2053,1542,2049,9082,1,9187,7,10,1, + 9187,8,3,2049,9119,10,9165,9216,145,100,101,99,105,109,97,108,0,1,10,4097, + 205,10,9205,9231,145,98,105,110,97,114,121,0,1,2,4097,205,10,9221,9245,145, + 111,99,116,97,108,0,1,8,4097,205,10,9236,9257,145,104,101,120,0,1,16, + 4097,205,10,9250,9278,145,105,111,58,101,110,117,109,101,114,97,116,101,0,27, + 10,9262,9292,145,105,111,58,113,117,101,114,121,0,28,10,9280,9307,145,105,111, + 58,105,110,118,111,107,101,0,29,10,9294,9324,145,105,111,58,115,99,97,110, + 45,102,111,114,0,1,-1,4,2049,9278,1793,9355,2049,9129,2049,9292,772,67502597,11,1793, + 9351,1793,9346,3,2049,9129,10,1,9342,2049,2155,10,1,9340,9,10,1,9331,2049,9182, + 3,10,9309,9370,145,99,58,112,117,116,0,1793,9372,1,0,2049,9307,10,9361,9383, + 145,110,108,0,1,10,2049,9370,10,9377,9394,145,115,112,0,1,32,2049,9370,10, + 9388,9406,145,116,97,98,0,1,9,2049,9370,10,9399,9420,145,115,58,112,117,116, + 0,1,9370,2049,3958,10,9411,9434,145,110,58,112,117,116,0,2049,7195,2049,9420,10, + 9425,9448,145,114,101,115,101,116,0,2049,1556,25,771,1,9448,7,10,9439,9470,145, + 100,117,109,112,45,115,116,97,99,107,0,2049,1556,25,134284547,9470,134283782,9434,2049,9394, + 10,9456,9488,145,70,82,69,69,0,2049,3606,1,1025,18,2049,1929,18,10,9480,9505, + 145,101,111,108,63,0,1793,9511,1,13,11,10,1,9507,1793,9519,1,10,11,10, + 1,9515,1793,9527,1,32,11,10,1,9523,2049,2214,22,22,10,9497,9544,145,118,97, + 108,105,100,63,0,2,2049,81,2049,2597,10,9534,9557,145,98,115,63,0,2,1793, + 9564,1,8,11,10,1,9560,1793,9572,1,127,11,10,1,9568,2049,2177,22,10,9550, + 9590,145,99,104,101,99,107,45,98,115,0,2049,9557,1793,9600,2049,3449,2049,3449,771, + 10,1,9594,9,10,9480,9613,145,99,58,103,101,116,0,1793,9615,1,1,2049,9324, + 2049,9307,10,9604,9631,145,115,58,103,101,116,0,1793,9659,1,7,15,2049,3517,1793, + 9650,2049,9613,2,2049,3425,2049,9590,2049,9505,10,1,9640,2049,2305,2049,3391,2049,3812,10, + 1,9633,2049,3541,10,9622,9674,145,108,105,115,116,101,110,0,2049,9631,2049,9544,1, + 379,1,15,2049,64,1,9674,7,10,0 }; diff --git a/vm/nga-c-no-libc/retro.c b/vm/nga-c-no-libc/retro.c index 5a10653..f31dd5e 100644 --- a/vm/nga-c-no-libc/retro.c +++ b/vm/nga-c-no-libc/retro.c @@ -1,137 +1,53 @@ -/* RETRO ------------------------------------------------------------- - A personal, minimalistic forth - Copyright (c) 2016 - 2019 Charles Childers +/* RETRO is a clean, elegant, and pragmatic dialect of Forth. It provides + a simple alternative for those willing to make a break from legacy + systems. - This is the `repl`, a basic interactive interface for RETRO. It is - intended to be simple and very minimalistic, providing the minimal - I/O and additions needed to support a basic RETRO system. For a much - larger system, see `rre`. + The language draws influences from many sources including traditional + Forth systems, cmForth, colorForth, Factor, and Parable. It was + designed to be easy to grasp and adapt to specific uses. - I'll include commentary throughout the source, so read on. - ---------------------------------------------------------------------*/ + The basic language is very portable and runs on a tiny virtual machine. + + This file contains a minimal implementation of the virtual machine. + + + Copyright (c) 2008 - 2021, Charles Childers + Copyright (c) 2009 - 2010, Luke Parrish + Copyright (c) 2010, Marc Simpson + Copyright (c) 2010, Jay Skeer + Copyright (c) 2011, Kenneth Keating +*/ + + +#define CELL int +#define CELL_MIN -2147483647 +#define CELL_MAX 2147483646 + +#define IMAGE_SIZE 524288 /* Amount of RAM. */ +#define ADDRESSES 128 /* Max address stack depth */ +#define STACK_DEPTH 32 /* Max data stack depth */ + +CELL sp, rp, ip; /* Stack and instruction pointers */ +CELL data[STACK_DEPTH]; /* The data stack */ +CELL address[ADDRESSES]; /* The address stack */ +CELL memory[IMAGE_SIZE + 1]; /* Image Memory */ + +#define TOS data[sp] /* Top item on stack */ +#define NOS data[sp-1] /* Second item on stack */ +#define TORS address[rp] /* Top item on address stack */ + +typedef void (*Handler)(void); + +#include "image.c" int getchar(void); int putchar(int c); -int r_strlen(char *str) { - const char *s; - for (s = str; *s; ++s); - return(s - str); -} - -int r_strcmp(const char *s1, const char *s2) { - while (*s1 == *s2++) - if (*s1++ == '\0') - return (0); - return (*(const unsigned char *)s1 - *(const unsigned char *)(s2 - 1)); -} - - - -/*--------------------------------------------------------------------- - First, a few constants relating to the image format and memory - layout. If you modify the kernel (Rx.md), these will need to be - altered to match your memory layout. - ---------------------------------------------------------------------*/ - -#define TIB memory[7] -#define D_OFFSET_LINK 0 -#define D_OFFSET_XT 1 -#define D_OFFSET_CLASS 2 -#define D_OFFSET_NAME 3 - - -/*--------------------------------------------------------------------- - Next we get into some things that relate to the Nga virtual machine - that RETRO runs on. - ---------------------------------------------------------------------*/ - -#define CELL long /* Cell size (32 bit, signed integer */ -#define IMAGE_SIZE 524288 * 8 /* Amount of RAM. 4MiB by default. */ -#define ADDRESSES 1024 /* Depth of address stack */ -#define STACK_DEPTH 128 /* Depth of data stack */ - -CELL sp, rp, ip; /* Data, address, instruction pointers */ -CELL data[STACK_DEPTH]; /* The data stack */ -CELL address[ADDRESSES]; /* The address stack */ -CELL memory[IMAGE_SIZE + 1]; /* The memory for the image */ - -#define TOS data[sp] /* Shortcut for top item on stack */ -#define NOS data[sp-1] /* Shortcut for second item on stack */ -#define TORS address[rp] /* Shortcut for top item on address stack */ - - -#define NUM_DEVICES 1 - -typedef void (*Handler)(void); - -Handler IO_deviceHandlers[NUM_DEVICES + 1]; -Handler IO_queryHandlers[NUM_DEVICES + 1]; - -#include "image.c" - -/*--------------------------------------------------------------------- - Moving forward, a few variables. These are updated to point to the - latest values in the image. - ---------------------------------------------------------------------*/ - -CELL Dictionary; -CELL NotFound; -CELL interpret; - - -/*--------------------------------------------------------------------- - Function prototypes. - ---------------------------------------------------------------------*/ - CELL stack_pop(); void stack_push(CELL value); -int string_inject(char *str, int buffer); -char *string_extract(int at); -int d_link(CELL dt); -int d_xt(CELL dt); -int d_class(CELL dt); -int d_name(CELL dt); -int d_lookup(CELL Dictionary, char *name); -CELL d_xt_for(char *Name, CELL Dictionary); -void update_rx(); -void execute(int cell); -void evaluate(char *s); -int not_eol(int ch); -void read_token(char *token_buffer, int echo); -CELL ngaLoadImage(char *imageFile); -void ngaPrepare(); -void ngaProcessOpcode(CELL opcode); -void ngaProcessPackedOpcodes(CELL opcode); -int ngaValidatePackedOpcodes(CELL opcode); - - -/*--------------------------------------------------------------------- - Here's an output helper. I define a wrapper over `write` to avoid - using `printf()`. - ---------------------------------------------------------------------*/ - -void retro_puts(char *s) { - while (*s) putchar(*s++); -} - - -/*--------------------------------------------------------------------- - Now to the fun stuff: interfacing with the virtual machine. There are - a things I like to have here: - - - push a value to the stack - - pop a value off the stack - - extract a string from the image - - inject a string into the image. - - lookup dictionary headers and access dictionary fields - ---------------------------------------------------------------------*/ - - -/*--------------------------------------------------------------------- - Stack push/pop is easy. I could avoid these, but it aids in keeping - the code readable, so it's worth the slight overhead. - ---------------------------------------------------------------------*/ +void execute(CELL cell); +void prepare_vm(); +void process_opcode_bundle(CELL opcode); CELL stack_pop() { sp--; @@ -143,351 +59,91 @@ void stack_push(CELL value) { data[sp] = value; } - -/*--------------------------------------------------------------------- - Strings are next. RETRO uses C-style NULL terminated strings. So I - can easily inject or extract a string. Injection iterates over the - string, copying it into the image. This also takes care to ensure - that the NULL terminator is added. - ---------------------------------------------------------------------*/ - -int string_inject(char *str, int buffer) { - int i = 0; - while (*str) { - memory[buffer + i] = (CELL)*str++; - memory[buffer + i + 1] = 0; - i++; - } - return buffer; -} - - -/*--------------------------------------------------------------------- - Extracting a string is similar, but I have to iterate over the VM - memory instead of a C string and copy the charaters into a buffer. - This uses a static buffer (`string_data`) as I prefer to avoid using - `malloc()`. - ---------------------------------------------------------------------*/ - -char string_data[1025]; -char *string_extract(int at) { - CELL starting = at; - CELL i = 0; - while(memory[starting] && i < 1024) - string_data[i++] = (char)memory[starting++]; - string_data[i] = 0; - return (char *)string_data; -} - - -/*--------------------------------------------------------------------- - Continuing along, I now define functions to access the dictionary. - - RETRO's dictionary is a linked list. Each entry is setup like: - - 0000 Link to previous entry (NULL if this is the root entry) - 0001 Pointer to definition start - 0002 Pointer to class handler - 0003 Start of a NULL terminated string with the word name - - First, functions to access each field. The offsets were defineed at - the start of the file. - ---------------------------------------------------------------------*/ - -int d_link(CELL dt) { - return dt + D_OFFSET_LINK; -} - -int d_xt(CELL dt) { - return dt + D_OFFSET_XT; -} - -int d_class(CELL dt) { - return dt + D_OFFSET_CLASS; -} - -int d_name(CELL dt) { - return dt + D_OFFSET_NAME; -} - - -/*--------------------------------------------------------------------- - Next, a more complext word. This will walk through the entries to - find one with a name that matches the specified name. This is *slow*, - but works ok unless you have a really large dictionary. (I've not - run into issues with this in practice). - ---------------------------------------------------------------------*/ - -int d_lookup(CELL Dictionary, char *name) { - CELL dt = 0; - CELL i = Dictionary; - char *dname; - while (memory[i] != 0 && i != 0) { - dname = string_extract(d_name(i)); - if (r_strcmp(dname, name) == 0) { - dt = i; - i = 0; - } else { - i = memory[i]; - } - } - return dt; -} - - -/*--------------------------------------------------------------------- - My last dictionary related word returns the `xt` pointer for a word. - This is used to help keep various important bits up to date. - ---------------------------------------------------------------------*/ - -CELL d_xt_for(char *Name, CELL Dictionary) { - return memory[d_xt(d_lookup(Dictionary, Name))]; -} - - - -/*--------------------------------------------------------------------- - This interface tracks a few words and variables in the image. These - are: - - Dictionary - the latest dictionary header - NotFound - called when a word is not found - interpret - the heart of the interpreter/compiler - - I have to call this periodically, as the Dictionary will change as - new words are defined, and the user might write a new error handler - or interpreter. - ---------------------------------------------------------------------*/ - -void update_rx() { - Dictionary = memory[2]; - NotFound = d_xt_for("err:notfound", Dictionary); - interpret = d_xt_for("interpret", Dictionary); -} - - -/*--------------------------------------------------------------------- - This is an implementation of the generic output device. It's set to - write output to the standard display. - ---------------------------------------------------------------------*/ - -void generic_output() { - putchar(stack_pop()); -} - -void generic_output_query() { - stack_push(0); - stack_push(0); -} - -/*--------------------------------------------------------------------- - With these out of the way, I implement `execute`, which takes an - address and runs the code at it. This has a couple of interesting - bits. - - Nga uses packed instruction bundles, with up to four instructions per - bundle. Since RETRO requires an additional instruction to handle - displaying a character, I define the handler for that here. - - This will also exit if the address stack depth is zero (meaning that - the word being run, and it's dependencies) are finished. - ---------------------------------------------------------------------*/ - -void execute(int cell) { +void execute(CELL cell) { CELL opcode; rp = 1; ip = cell; while (ip < IMAGE_SIZE) { - if (ip == NotFound) { - retro_puts(string_extract(TIB)); - retro_puts(" ?\n"); - } opcode = memory[ip]; - if (ngaValidatePackedOpcodes(opcode) != 0) { - ngaProcessPackedOpcodes(opcode); - } else { - retro_puts("Invalid instruction!\n"); - retro_puts("System halted.\n"); - while(1); - } + process_opcode_bundle(opcode); ip++; if (rp == 0) ip = IMAGE_SIZE; } } - -/*--------------------------------------------------------------------- - RETRO's `interpret` word expects a token on the stack. This next - function copies a token to the `TIB` (text input buffer) and then - calls `interpret` to process it. - ---------------------------------------------------------------------*/ - -void evaluate(char *s) { - if (r_strlen(s) == 0) return; - update_rx(); - string_inject(s, TIB); - stack_push(TIB); - execute(interpret); -} - - -/*--------------------------------------------------------------------- - `read_token` reads a token from the specified file. It will stop on - a whitespace or newline. It also tries to handle backspaces, though - the success of this depends on how your terminal is configured. - ---------------------------------------------------------------------*/ - -int not_eol(int ch) { - return (ch != (char)10) && (ch != (char)13) && (ch != (char)32) && (ch != 0); -} - -void read_token(char *token_buffer, int echo) { - int ch = getchar(); - if (echo != 0) - putchar(ch); - int count = 0; - while (not_eol(ch)) - { - if ((ch == 8 || ch == 127) && count > 0) { - count--; - if (echo != 0) { - putchar(8); - putchar(32); - putchar(8); - } - } else { - token_buffer[count++] = ch; - } - ch = getchar(); - if (echo != 0) - putchar(ch); - } - token_buffer[count] = '\0'; -} - - -/*--------------------------------------------------------------------- - The `main()` routine. This sets up the Nga VM, loads the image, and - enters a loop. - - The loop: - - - reads input - - otherwise, pass to `evaluate()` to run - ---------------------------------------------------------------------*/ - int main(int argc, char **argv) { - char input[1024]; - IO_deviceHandlers[0] = generic_output; - IO_queryHandlers[0] = generic_output_query; - ngaPrepare(); + prepare_vm(); + for (CELL i = 0; i < ngaImageCells; i++) memory[i] = ngaImage[i]; - update_rx(); - retro_puts("RETRO Listener (c) 2016-2019, Charles Childers\n\n"); - while(1) { - Dictionary = memory[2]; - read_token(input, 0); - evaluate(input); - } + + execute(0); return 0; } - -/* Nga ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Copyright (c) 2008 - 2019, Charles Childers - Copyright (c) 2009 - 2010, Luke Parrish - Copyright (c) 2010, Marc Simpson - Copyright (c) 2010, Jay Skeer - Copyright (c) 2011, Kenneth Keating - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ - -enum vm_opcode { - VM_NOP, VM_LIT, VM_DUP, VM_DROP, VM_SWAP, VM_PUSH, VM_POP, - VM_JUMP, VM_CALL, VM_CCALL, VM_RETURN, VM_EQ, VM_NEQ, VM_LT, - VM_GT, VM_FETCH, VM_STORE, VM_ADD, VM_SUB, VM_MUL, VM_DIVMOD, - VM_AND, VM_OR, VM_XOR, VM_SHIFT, VM_ZRET, VM_HALT, VM_IE, - VM_IQ, VM_II -}; -#define NUM_OPS VM_II + 1 - -#ifndef NUM_DEVICES -#define NUM_DEVICES 0 -#endif - -CELL ngaLoadImage(char *imageFile) { - CELL i; - for (i = 0; i < ngaImageCells; i++) - memory[i] = ngaImage[i]; - return i; -} - -void ngaPrepare() { +void prepare_vm() { ip = sp = rp = 0; for (ip = 0; ip < IMAGE_SIZE; ip++) - memory[ip] = VM_NOP; + memory[ip] = 0; /* NO - nop instruction */ for (ip = 0; ip < STACK_DEPTH; ip++) data[ip] = 0; for (ip = 0; ip < ADDRESSES; ip++) address[ip] = 0; } -void inst_nop() { +void inst_no() { } -void inst_lit() { - sp++; +void inst_li() { ip++; - TOS = memory[ip]; + stack_push(memory[ip]); } -void inst_dup() { - sp++; - data[sp] = NOS; +void inst_du() { + stack_push(TOS); } -void inst_drop() { +void inst_dr() { data[sp] = 0; if (--sp < 0) ip = IMAGE_SIZE; } -void inst_swap() { +void inst_sw() { CELL a; a = TOS; TOS = NOS; NOS = a; } -void inst_push() { +void inst_pu() { rp++; TORS = TOS; - inst_drop(); + inst_dr(); } -void inst_pop() { - sp++; - TOS = TORS; +void inst_po() { + stack_push(TORS); rp--; } -void inst_jump() { +void inst_ju() { ip = TOS - 1; - inst_drop(); + inst_dr(); } -void inst_call() { +void inst_ca() { rp++; TORS = ip; ip = TOS - 1; - inst_drop(); + inst_dr(); } -void inst_ccall() { +void inst_cc() { CELL a, b; - a = TOS; inst_drop(); /* False */ - b = TOS; inst_drop(); /* Flag */ + a = TOS; inst_dr(); /* Target */ + b = TOS; inst_dr(); /* Flag */ if (b != 0) { rp++; TORS = ip; @@ -495,66 +151,68 @@ void inst_ccall() { } } -void inst_return() { +void inst_re() { ip = TORS; rp--; } void inst_eq() { NOS = (NOS == TOS) ? -1 : 0; - inst_drop(); + inst_dr(); } -void inst_neq() { +void inst_ne() { NOS = (NOS != TOS) ? -1 : 0; - inst_drop(); + inst_dr(); } void inst_lt() { NOS = (NOS < TOS) ? -1 : 0; - inst_drop(); + inst_dr(); } void inst_gt() { NOS = (NOS > TOS) ? -1 : 0; - inst_drop(); + inst_dr(); } -void inst_fetch() { +void inst_fe() { switch (TOS) { case -1: TOS = sp - 1; break; case -2: TOS = rp; break; case -3: TOS = IMAGE_SIZE; break; + case -4: TOS = CELL_MIN; break; + case -5: TOS = CELL_MAX; break; default: TOS = memory[TOS]; break; } } -void inst_store() { +void inst_st() { if (TOS <= IMAGE_SIZE && TOS >= 0) { memory[TOS] = NOS; - inst_drop(); - inst_drop(); + inst_dr(); + inst_dr(); } else { ip = IMAGE_SIZE; } } -void inst_add() { +void inst_ad() { NOS += TOS; - inst_drop(); + inst_dr(); } -void inst_sub() { +void inst_su() { NOS -= TOS; - inst_drop(); + inst_dr(); } -void inst_mul() { +void inst_mu() { NOS *= TOS; - inst_drop(); + inst_dr(); } -void inst_divmod() { +void inst_di() { CELL a, b; a = TOS; b = NOS; @@ -562,97 +220,86 @@ void inst_divmod() { NOS = b % a; } -void inst_and() { +void inst_an() { NOS = TOS & NOS; - inst_drop(); + inst_dr(); } void inst_or() { NOS = TOS | NOS; - inst_drop(); + inst_dr(); } -void inst_xor() { +void inst_xo() { NOS = TOS ^ NOS; - inst_drop(); + inst_dr(); } -void inst_shift() { +void inst_sh() { CELL y = TOS; CELL x = NOS; if (TOS < 0) - NOS = NOS << (TOS * -1); + NOS = NOS << (0 - TOS); else { if (x < 0 && y > 0) NOS = x >> y | ~(~0U >> y); else NOS = x >> y; } - inst_drop(); + inst_dr(); } -void inst_zret() { +void inst_zr() { if (TOS == 0) { - inst_drop(); + inst_dr(); ip = TORS; rp--; } } -void inst_halt() { +void inst_ha() { ip = IMAGE_SIZE; } void inst_ie() { - sp++; - TOS = NUM_DEVICES; + stack_push(2); } void inst_iq() { - CELL Device = TOS; - inst_drop(); - IO_queryHandlers[Device](); + if (TOS == 0) { + inst_dr(); + stack_push(0); + stack_push(0); + } else if (TOS == 1) { + inst_dr(); + stack_push(1); + stack_push(1); + } } void inst_ii() { - CELL Device = TOS; - inst_drop(); - IO_deviceHandlers[Device](); + if (TOS == 0) { + inst_dr(); + putchar(stack_pop()); + } else if (TOS == 1) { + inst_dr(); + stack_push(getchar()); + } else { + inst_dr(); + } } -Handler instructions[NUM_OPS] = { - inst_nop, inst_lit, inst_dup, inst_drop, inst_swap, inst_push, inst_pop, - inst_jump, inst_call, inst_ccall, inst_return, inst_eq, inst_neq, inst_lt, - inst_gt, inst_fetch, inst_store, inst_add, inst_sub, inst_mul, inst_divmod, - inst_and, inst_or, inst_xor, inst_shift, inst_zret, inst_halt, inst_ie, +Handler instructions[] = { + inst_no, inst_li, inst_du, inst_dr, inst_sw, inst_pu, inst_po, + inst_ju, inst_ca, inst_cc, inst_re, inst_eq, inst_ne, inst_lt, + inst_gt, inst_fe, inst_st, inst_ad, inst_su, inst_mu, inst_di, + inst_an, inst_or, inst_xo, inst_sh, inst_zr, inst_ha, inst_ie, inst_iq, inst_ii }; -void ngaProcessOpcode(CELL opcode) { - if (opcode != 0) - instructions[opcode](); +void process_opcode_bundle(CELL opcode) { + instructions[opcode & 0xFF](); + instructions[(opcode >> 8) & 0xFF](); + instructions[(opcode >> 16) & 0xFF](); + instructions[(opcode >> 24) & 0xFF](); } - -int ngaValidatePackedOpcodes(CELL opcode) { - CELL raw = opcode; - CELL current; - int valid = -1; - int i; - for (i = 0; i < 4; i++) { - current = raw & 0xFF; - if (!(current >= 0 && current <= 29)) - valid = 0; - raw = raw >> 8; - } - return valid; -} - -void ngaProcessPackedOpcodes(CELL opcode) { - CELL raw = opcode; - int i; - for (i = 0; i < 4; i++) { - ngaProcessOpcode(raw & 0xFF); - raw = raw >> 8; - } -} -