diff tests/agcl/examples/good/krc.cpp @ 0:13d2b8934445

Import AnaGram (near-)release tree into Mercurial.
author David A. Holland
date Sat, 22 Dec 2007 17:52:45 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/agcl/examples/good/krc.cpp	Sat Dec 22 17:52:45 2007 -0500
@@ -0,0 +1,1750 @@
+/*
+ * AnaGram, a System for Syntax Directed Programming
+ * C Macro preprocessor
+ * Sample C Grammar
+ * Compatible with Kernighan and Ritchie, 2nd. Edition.
+ *
+ * Copyright 1993-2000 Parsifal Software. All Rights Reserved.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ */
+
+#include "mpp.h"
+
+stack<unsigned> id_stack(100,20);
+
+
+/*
+ * AnaGram, A System for Syntax Directed Programming
+ * File generated by: ...
+ *
+ * AnaGram Parsing Engine
+ * Copyright 1993-2002 Parsifal Software. All Rights Reserved.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ */
+
+#ifndef KRC_H
+#include "krc.h"
+#endif
+
+#ifndef KRC_H
+#error Mismatched header file
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+
+#define RULE_CONTEXT (&((PCB).cs[(PCB).ssx]))
+#define ERROR_CONTEXT ((PCB).cs[(PCB).error_frame_ssx])
+#define CONTEXT ((PCB).cs[(PCB).ssx])
+
+
+
+cc_pcb_type cc_pcb;
+#define PCB cc_pcb
+#define CHANGE_REDUCTION(x) cc_change_reduction(cc_##x##_token)
+int cc_change_reduction(cc_token_type);
+
+#define INPUT_VALUE(type) *(type *) &(PCB).input_value
+
+#line - "krc.syn"
+                                           // Embedded C
+#include <stack.h>
+
+
+// Macro Definitions
+
+#define INPUT_CODE(T) (T).id
+#define SYNTAX_ERROR  syntax_error(PCB.error_message)
+
+
+// Variable definitions
+
+static int use_count = 0;
+symbol_type_enum symbol_table[N_SYMBOLS];
+
+
+/*
+  mark_typedef() gets a non_zero argument for typedef statements, a zero
+  argument otherwise. If the argument is non-zero it marks all stacked
+  identifiers as typedef_names. It then resets the id stack.
+*/
+
+static void mark_typedef(int mask) {
+  unsigned x;
+  if (mask) {
+    while (size(id_stack)) {
+      id_stack >> x;
+      symbol_table[x] = typedef_name;
+    }
+    return;
+  }
+  reset(id_stack);
+}
+
+/*
+  check_typedef() resolves a semantically determined productin by determining
+  whether a token is a typedef_name or not.  If so it changes the reduction
+  token appropriately.
+*/
+
+static token check_typedef(token t) {
+  if (symbol_table[t.handle] == typedef_name)
+    CHANGE_REDUCTION(typedef_name);
+  return t;
+}
+
+
+// Member Functions for Class c_parser
+
+// Constructor
+
+/*
+  This parser has no provisions for multiple simultaneous parses or for
+  recursion. The purpose of use_count is to make sure that there is only one
+  copy of the parser active at any time.
+*/
+
+
+c_parser::c_parser() {
+  assert(use_count == 0);
+  use_count++;
+  reset(id_stack);
+  memset(symbol_table, 0, sizeof(symbol_table));
+  init_cc();                                // init parse
+}
+
+
+// Destructor
+
+c_parser::~c_parser() {
+  use_count--;                              // Makes parser available
+}
+
+
+// Reset Parser
+
+c_parser &reset(c_parser &c) {
+  reset(id_stack);
+  memset(symbol_table, 0, sizeof(symbol_table));
+  init_cc();                                // init parse
+  return c;
+}
+
+
+// Transmit token to c_parser
+
+/*
+  The overloaded operator "<<" is used to transmit data to a parser.
+  Newline tokens are filtered out, since they are passed along by the
+  token scanner only in case text output of the preprocessor is
+  required.
+
+  If the parser has encountered an error, there is no point in giving
+  it any further input.
+
+  Otherwise, the input_code and input_value fields of the pcb are set
+  up and cc() is called to deal with the token.
+*/
+
+token_sink &c_parser::operator << (token c) {
+  if (PCB.exit_flag != AG_RUNNING_CODE || (int) c.id == '\n') return *this;
+  PCB.input_code = c.id;
+  PCB.input_value = c;
+  cc();
+  return *this;
+}
+
+token_sink &c_parser::operator << (token *s) {
+  while (s->id != END_OF_FILE && PCB.exit_flag == AG_RUNNING_CODE) {
+    if ((int) s->id == 10) continue;
+    PCB.input_code = s->id;
+    PCB.input_value = *s++;
+    cc();
+  }
+  return *this;
+}
+
+#line - "krc.cpp"
+
+#ifndef CONVERT_CASE
+#define CONVERT_CASE(c) (c)
+#endif
+#ifndef TAB_SPACING
+#define TAB_SPACING 8
+#endif
+
+static void ag_rp_1(int m) {
+#line - "krc.syn"
+  mark_typedef(m);
+#line - "krc.cpp"
+}
+
+static int ag_rp_2(void) {
+#line - "krc.syn"
+  return 0;
+#line - "krc.cpp"
+}
+
+static int ag_rp_3(void) {
+#line - "krc.syn"
+  return 0;
+#line - "krc.cpp"
+}
+
+static int ag_rp_4(int m, int v) {
+#line - "krc.syn"
+  return m | v;
+#line - "krc.cpp"
+}
+
+static int ag_rp_5(void) {
+#line - "krc.syn"
+  return 0;
+#line - "krc.cpp"
+}
+
+static int ag_rp_6(void) {
+#line - "krc.syn"
+  return 0;
+#line - "krc.cpp"
+}
+
+static int ag_rp_7(void) {
+#line - "krc.syn"
+  return 0;
+#line - "krc.cpp"
+}
+
+static int ag_rp_8(void) {
+#line - "krc.syn"
+  return 0;
+#line - "krc.cpp"
+}
+
+static int ag_rp_9(void) {
+#line - "krc.syn"
+  return 1;
+#line - "krc.cpp"
+}
+
+static void ag_rp_10(void) {
+#line - "krc.syn"
+  ++id_stack;
+#line - "krc.cpp"
+}
+
+static void ag_rp_11(void) {
+#line - "krc.syn"
+  --id_stack;
+#line - "krc.cpp"
+}
+
+static void ag_rp_12(token n) {
+#line - "krc.syn"
+  id_stack << n.handle;
+#line - "krc.cpp"
+}
+
+static token ag_rp_13(token n) {
+#line - "krc.syn"
+  return check_typedef(n);
+#line - "krc.cpp"
+}
+
+
+#ifndef AG_TRACE_FILE_NAME
+#define AG_TRACE_FILE_NAME "krc.etr"
+#endif
+
+static void ag_trace_error(void) {
+  FILE *ag_file = fopen(AG_TRACE_FILE_NAME, "w");
+  int i;
+  if (ag_file == NULL) return;
+  fprintf(ag_file, "%d\n", (PCB).ssx);
+  for (i = 0; i < (PCB).ssx; i++) fprintf(ag_file, "%d\n", (PCB).ss[i]);
+  fprintf(ag_file, "%d\n", (PCB).sn);
+  fprintf(ag_file, "%d\n", (PCB).token_number);
+  fclose(ag_file);
+}
+
+
+#define READ_COUNTS 
+#define WRITE_COUNTS 
+#undef V
+#define V(i,t) (*t (&(PCB).vs[(PCB).ssx + i]))
+#undef VS
+#define VS(i) (PCB).vs[(PCB).ssx + i]
+
+#ifndef GET_CONTEXT
+#define GET_CONTEXT CONTEXT = (PCB).input_context
+#endif
+
+typedef enum {
+  ag_action_1,
+  ag_action_2,
+  ag_action_3,
+  ag_action_4,
+  ag_action_5,
+  ag_action_6,
+  ag_action_7,
+  ag_action_8,
+  ag_action_9,
+  ag_action_10,
+  ag_action_11,
+  ag_action_12
+} ag_parser_action;
+
+
+#ifndef NULL_VALUE_INITIALIZER
+#define NULL_VALUE_INITIALIZER = { 0 }
+#endif
+
+static cc_vs_type const ag_null_value NULL_VALUE_INITIALIZER;
+
+static const unsigned char ag_rpx[] = {
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  2,  3,
+    4,  0,  0,  5,  6,  7,  8,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0, 10, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+   12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0, 13
+};
+
+#define AG_TCV(x) ag_tcv[(x)]
+
+static const unsigned char ag_tcv[] = {
+    4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,153,  0,  0,
+    0,146,129,  0, 62, 63, 70,142, 48,143,157,145,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0, 55, 14,134, 49,135,119,  0,123,115,158,  0,149,109, 74,
+  131,117,137,148,136,139,113,110,112,108,132,116,121,111,140,114,165,160,
+    0, 64,  0, 66,127,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 41,125, 43,
+  152,  0,  0,161,162,163,164, 83, 18,103, 89, 24, 35,102, 90, 99, 29, 96,
+   57, 21, 28,100,101, 95, 26, 27, 19,104, 25, 30,151, 20, 44, 97, 22, 45,
+   31, 23, 36, 98,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0
+};
+
+#ifndef SYNTAX_ERROR
+#define SYNTAX_ERROR fprintf(stderr,"%s, line %d, column %d\n", \
+  (PCB).error_message, (PCB).line, (PCB).column)
+#endif
+
+#ifndef FIRST_LINE
+#define FIRST_LINE 1
+#endif
+
+#ifndef FIRST_COLUMN
+#define FIRST_COLUMN 1
+#endif
+
+#ifndef PARSER_STACK_OVERFLOW
+#define PARSER_STACK_OVERFLOW {fprintf(stderr, \
+   "\nParser stack overflow, line %d, column %d\n",\
+   (PCB).line, (PCB).column);}
+#endif
+
+#ifndef REDUCTION_TOKEN_ERROR
+#define REDUCTION_TOKEN_ERROR {fprintf(stderr, \
+    "\nReduction token error, line %d, column %d\n", \
+    (PCB).line, (PCB).column);}
+#endif
+
+
+#ifndef AG_NEWLINE
+#define AG_NEWLINE 10
+#endif
+
+#ifndef AG_RETURN
+#define AG_RETURN 13
+#endif
+
+#ifndef AG_FORMFEED
+#define AG_FORMFEED 12
+#endif
+
+#ifndef AG_TABCHAR
+#define AG_TABCHAR 9
+#endif
+
+static void ag_track(void) {
+  switch ((PCB).input_code) {
+  case AG_NEWLINE:
+    (PCB).column = 1, (PCB).line++;
+  case AG_RETURN:
+  case AG_FORMFEED:
+    break;
+  case AG_TABCHAR:
+    (PCB).column += (TAB_SPACING) - ((PCB).column - 1) % (TAB_SPACING);
+    break;
+  default:
+    (PCB).column++;
+  }
+  (PCB).read_flag = 1;
+}
+
+
+static void ag_prot(void) {
+  int ag_k;
+  ag_k = 128 - ++(PCB).btsx;
+  if (ag_k <= (PCB).ssx) {
+    ag_trace_error();
+    (PCB).exit_flag = AG_STACK_ERROR_CODE;
+    PARSER_STACK_OVERFLOW;
+    return;
+  }
+  (PCB).bts[(PCB).btsx] = (PCB).sn;
+  (PCB).bts[ag_k] = (PCB).ssx;
+  (PCB).vs[ag_k] = (PCB).vs[(PCB).ssx];
+  (PCB).ss[ag_k] = (PCB).ss[(PCB).ssx];
+}
+
+static void ag_undo(void) {
+  if ((PCB).drt == -1) return;
+  while ((PCB).btsx) {
+    int ag_k = 128 - (PCB).btsx;
+    (PCB).sn = (PCB).bts[(PCB).btsx--];
+    (PCB).ssx = (PCB).bts[ag_k];
+    (PCB).vs[(PCB).ssx] = (PCB).vs[ag_k];
+    (PCB).ss[(PCB).ssx] = (PCB).ss[ag_k];
+  }
+  (PCB).token_number = (cc_token_type) (PCB).drt;
+  (PCB).ssx = (PCB).dssx;
+  (PCB).sn = (PCB).dsn;
+  (PCB).drt = -1;
+}
+
+
+
+static const int ag_rtt[] = {
+   38, 34,  0
+};
+
+static const unsigned char ag_tstt[] = {
+83,70,62,57,45,44,36,35,31,30,29,28,27,26,25,24,23,22,21,20,19,18,0,1,3,5,6,
+  7,8,11,15,16,17,32,33,34,37,38,60,61,
+83,41,0,38,39,
+83,41,0,38,39,
+83,70,64,63,62,48,36,35,0,17,71,72,
+83,70,62,0,8,38,60,61,
+83,62,0,38,60,
+64,62,0,
+83,70,62,57,45,44,36,35,31,30,29,28,27,26,25,24,23,22,21,20,19,18,14,0,8,12,
+  13,15,16,17,32,33,34,37,38,47,60,61,
+83,57,45,44,41,36,35,31,30,29,28,27,26,25,24,23,22,21,20,19,18,0,7,9,10,11,
+  15,16,17,32,33,34,37,
+83,70,62,57,45,44,36,35,31,30,29,28,27,26,25,24,23,22,21,20,19,18,4,0,5,6,7,
+  8,11,15,16,17,32,33,34,37,38,60,61,
+83,70,64,63,62,57,55,48,45,44,41,36,35,31,30,29,28,27,26,25,24,23,22,21,20,
+  19,18,14,0,
+41,0,
+83,70,64,63,62,57,55,48,45,44,41,36,35,31,30,29,28,27,26,25,24,23,22,21,20,
+  19,18,14,0,
+41,0,40,
+36,35,0,17,
+70,0,61,
+63,0,
+64,62,0,
+83,63,57,45,44,36,35,31,30,29,28,27,26,25,24,23,22,21,20,19,18,0,11,15,16,
+  17,32,33,34,37,38,67,68,69,73,75,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,66,62,0,38,56,
+  65,105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+48,0,
+14,0,
+83,57,49,45,44,41,36,35,31,30,29,28,27,26,25,24,23,22,21,20,19,18,0,7,9,10,
+  11,15,16,17,32,33,34,37,
+83,70,62,57,45,44,36,35,31,30,29,28,27,26,25,24,23,22,21,20,19,18,14,0,8,12,
+  13,15,16,17,32,33,34,37,38,47,60,61,
+83,57,45,44,41,36,35,31,30,29,28,27,26,25,24,23,22,21,20,19,18,0,7,9,11,15,
+  16,17,32,33,34,37,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,104,103,102,101,100,
+  99,98,97,95,90,89,83,70,63,62,57,45,44,43,41,36,35,31,30,29,28,27,26,25,
+  24,23,22,21,20,19,18,14,0,2,7,9,10,11,15,16,17,32,33,34,37,38,78,84,85,
+  86,87,88,91,92,93,94,105,106,118,120,122,124,126,128,130,133,138,141,
+  144,147,150,154,159,
+83,0,38,58,59,
+41,0,
+48,0,
+63,0,
+83,70,64,63,62,57,48,45,44,36,35,31,30,29,28,27,26,25,24,23,22,21,20,19,18,
+  0,8,15,16,17,32,33,34,37,38,60,61,76,77,81,
+48,0,
+63,0,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  147,150,154,159,
+158,157,149,148,64,62,0,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,57,45,44,
+  36,35,31,30,29,28,27,26,25,24,23,0,16,17,32,33,34,37,38,51,78,80,91,105,
+  106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+146,145,70,0,
+143,142,0,
+140,139,0,
+137,136,135,134,0,
+132,131,0,
+129,0,
+127,0,
+125,0,
+123,0,
+121,119,0,
+66,0,
+83,70,62,0,8,38,47,60,61,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,41,0,38,50,
+  78,105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+83,57,45,44,41,36,35,31,30,29,28,27,26,25,24,23,22,21,20,19,18,0,7,9,11,15,
+  16,17,32,33,34,37,
+49,0,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,104,103,102,101,100,
+  99,98,97,95,90,89,83,70,63,62,57,45,44,43,41,36,35,31,30,29,28,27,26,25,
+  24,23,22,21,20,19,18,14,0,2,7,9,11,15,16,17,32,33,34,37,38,78,84,85,86,
+  87,88,91,92,93,94,105,106,118,120,122,124,126,128,130,133,138,141,144,
+  147,150,154,159,
+117,116,115,114,113,112,111,110,109,108,49,0,107,
+48,0,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,14,0,38,78,
+  91,92,105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,
+  159,
+14,0,
+14,0,
+83,0,38,
+62,0,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,104,103,102,101,100,
+  99,98,97,95,90,89,83,70,62,41,14,0,2,9,38,78,84,85,86,87,88,91,92,105,
+  106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+62,0,
+62,0,
+62,0,
+14,0,
+55,0,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,56,
+  105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+55,0,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,104,103,102,101,100,
+  99,98,97,95,90,89,83,70,63,62,43,41,14,0,2,9,38,78,84,85,86,87,88,91,92,
+  105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+43,0,
+49,0,
+48,43,0,
+83,57,45,44,36,35,31,30,29,28,27,26,25,24,23,0,16,17,32,33,34,37,42,46,51,
+83,0,38,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,66,62,0,38,56,
+  65,105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+64,62,0,
+83,70,64,63,62,57,45,44,36,35,31,30,29,28,27,26,25,24,23,22,21,20,19,18,0,8,
+  11,15,16,17,32,33,34,37,38,60,61,67,73,75,76,81,82,
+83,64,62,0,38,60,81,
+83,74,57,45,44,36,35,31,30,29,28,27,26,25,24,23,22,21,20,19,18,0,11,15,16,
+  17,32,33,34,37,75,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,57,45,44,
+  36,35,31,30,29,28,27,26,25,24,23,0,16,17,32,33,34,37,38,51,78,80,91,105,
+  106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,78,91,
+  105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+83,0,38,
+83,0,38,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,63,62,0,38,78,
+  105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,155,156,
+  159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,78,91,
+  105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+63,48,0,
+83,70,64,63,62,57,45,44,36,35,31,30,29,28,27,26,25,24,23,0,16,17,32,33,34,
+  37,61,76,77,81,
+63,0,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  130,133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  130,133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  128,130,133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  126,128,130,133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  124,126,128,130,133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  122,124,126,128,130,133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,78,91,
+  105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,41,0,38,50,
+  78,79,105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,
+  159,
+43,0,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,78,
+  105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,78,
+  105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+14,0,
+14,0,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,14,0,38,78,
+  91,92,105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,
+  159,
+98,0,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,78,91,
+  105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,78,91,
+  105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,78,91,
+  105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,104,103,102,101,100,
+  99,98,97,95,90,89,83,70,62,41,14,0,2,9,38,78,84,85,86,87,88,91,92,105,
+  106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+55,0,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,104,103,102,101,100,
+  99,98,97,95,90,89,83,70,62,41,14,0,2,9,38,78,84,85,86,87,88,91,92,105,
+  106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,56,
+  105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+83,0,38,59,
+83,70,62,57,55,45,44,36,35,31,30,29,28,27,26,25,24,23,0,8,16,17,32,33,34,37,
+  38,52,53,54,60,61,
+83,57,45,44,43,36,35,31,30,29,28,27,26,25,24,23,0,16,17,32,33,34,37,46,51,
+66,0,
+83,63,57,45,44,36,35,31,30,29,28,27,26,25,24,23,22,21,20,19,18,0,11,15,16,
+  17,32,33,34,37,67,73,75,82,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,66,62,0,38,56,
+  65,105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+63,0,
+63,0,
+64,62,0,
+63,0,
+48,0,
+63,0,
+66,48,0,
+83,70,64,63,62,57,45,44,36,35,31,30,29,28,27,26,25,24,23,22,21,20,19,18,0,
+  11,15,16,17,32,33,34,37,61,67,73,75,76,81,82,
+64,62,0,81,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,106,
+  144,147,150,154,159,
+146,145,70,0,
+146,145,70,0,
+143,142,0,
+143,142,0,
+140,139,0,
+140,139,0,
+140,139,0,
+140,139,0,
+137,136,135,134,0,
+137,136,135,134,0,
+132,131,0,
+129,0,
+127,0,
+125,0,
+123,0,
+55,48,0,
+48,43,0,
+14,0,
+62,0,
+63,48,0,
+63,48,0,
+63,48,0,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,104,103,102,101,100,
+  99,98,97,95,90,89,83,70,62,41,14,0,2,9,38,78,84,85,86,87,88,91,92,105,
+  106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+55,0,
+55,48,14,0,
+48,14,0,
+63,0,
+66,0,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,78,
+  105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,105,
+  106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,43,41,0,38,
+  50,78,105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,
+  159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,14,0,38,78,
+  91,92,105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,
+  159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,78,91,
+  105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,104,103,102,101,100,
+  99,98,97,95,90,89,83,70,62,41,14,0,2,9,38,78,84,85,86,87,88,91,92,105,
+  106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,104,103,102,101,100,
+  99,98,97,95,90,89,83,70,62,41,14,0,2,9,38,78,84,85,86,87,88,91,92,105,
+  106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,104,103,102,101,100,
+  99,98,97,95,90,89,83,70,62,41,14,0,2,9,38,78,84,85,86,87,88,91,92,105,
+  106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,62,0,38,56,
+  105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+83,70,62,55,0,8,38,53,54,60,61,
+14,0,
+63,48,0,
+96,0,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,83,70,63,62,0,38,78,
+  91,92,105,106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,
+  159,
+14,0,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,104,103,102,101,100,
+  99,98,97,95,90,89,83,70,62,41,14,0,2,9,38,78,84,85,86,87,88,91,92,105,
+  106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+63,0,
+165,164,163,162,161,160,153,152,151,149,148,143,142,129,104,103,102,101,100,
+  99,98,97,95,90,89,83,70,62,41,14,0,2,9,38,78,84,85,86,87,88,91,92,105,
+  106,118,120,122,124,126,128,130,133,138,141,144,147,150,154,159,
+  0
+};
+
+
+static unsigned const char ag_astt[3496] = {
+  2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,7,0,1,1,1,1,1,1,1,2,2,2,2,2,1,
+  2,1,1,2,8,7,1,1,2,5,7,1,1,5,8,5,5,5,5,1,1,7,1,1,1,2,1,1,7,1,2,1,1,2,1,7,2,
+  1,1,1,5,2,1,1,1,1,1,9,9,9,9,9,9,9,9,9,9,9,2,2,2,2,2,8,7,1,1,1,2,3,3,3,3,3,
+  1,2,1,1,1,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,7,1,3,1,1,1,2,2,2,2,2,
+  1,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,7,3,3,3,1,1,1,2,2,2,2,2,1,
+  2,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,7,1,7,5,5,5,
+  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,7,4,7,1,9,9,5,3,1,5,3,3,
+  7,1,1,5,2,8,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,7,1,1,2,2,2,2,2,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,8,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,5,2,7,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,1,3,1,1,1,
+  2,2,2,2,2,1,2,1,1,1,1,1,9,9,9,9,9,9,9,9,9,9,9,2,2,2,2,2,8,7,1,1,1,2,3,3,3,
+  3,3,1,2,1,1,1,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,7,3,3,1,1,2,2,2,2,
+  2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,5,1,1,1,1,8,1,2,
+  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,8,7,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,7,1,1,1,1,7,1,5,3,7,2,1,1,5,1,1,
+  5,1,1,9,9,9,9,9,9,9,9,9,9,9,2,2,2,2,2,7,3,2,3,3,3,3,3,1,2,1,1,3,3,1,1,5,3,
+  7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,2,1,1,7,1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,3,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,3,1,1,1,1,1,1,9,9,1,1,5,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,5,1,1,5,1,1,1,1,5,1,1,5,1,5,
+  1,5,1,5,1,5,1,1,5,3,7,2,1,1,7,1,2,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,
+  1,7,1,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,
+  2,2,2,2,2,2,7,3,3,1,1,2,2,2,2,2,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,2,1,5,1,1,1,1,8,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,8,7,1,3,1,
+  1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,5,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,8,7,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,7,3,7,2,7,1,1,7,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,8,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,7,1,7,1,7,3,7,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,
+  1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,2,1,5,1,5,1,8,7,3,3,1,1,3,3,3,3,3,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,3,7,1,5,1,3,7,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,
+  1,1,1,1,1,2,7,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,8,1,7,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,5,2,1,1,8,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+  7,1,1,1,2,2,2,2,2,1,2,1,1,1,1,1,1,1,1,2,1,1,5,2,1,1,2,3,1,1,1,2,2,2,2,2,2,
+  2,2,2,2,2,2,2,2,2,2,7,1,1,2,2,2,2,2,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,2,7,3,2,7,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,8,1,7,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,7,2,1,1,5,1,1,1,1,9,9,9,9,9,9,9,9,9,
+  9,9,7,3,3,3,3,3,1,1,3,3,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,3,3,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,2,1,1,7,1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,
+  1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,2,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,
+  1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,2,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,
+  7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,7,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,3,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,3,3,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,3,3,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,7,3,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,8,7,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  2,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,2,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,2,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,8,7,3,3,1,1,3,3,3,3,3,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,2,1,1,1,8,7,3,3,1,1,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,7,
+  1,3,2,1,1,1,8,1,1,9,9,9,9,9,9,9,9,9,9,9,7,1,3,3,3,3,3,1,2,1,1,1,1,1,2,1,1,
+  1,2,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,3,1,3,7,2,8,1,1,1,2,2,2,2,2,2,2,2,
+  2,2,2,2,2,2,2,2,7,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,
+  8,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,7,3,7,1,1,5,3,7,1,5,3,7,3,
+  1,7,2,1,1,8,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,7,1,1,2,2,2,2,2,1,1,1,
+  1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,7,1,3,3,1,1,1,1,1,1,1,
+  5,1,1,1,5,1,1,5,1,1,5,1,1,5,1,1,5,1,1,5,1,1,5,1,1,1,1,5,1,1,1,1,5,1,1,5,1,
+  5,1,5,1,5,1,5,1,1,7,1,3,7,1,7,1,7,1,1,7,1,1,7,1,1,7,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,8,7,3,3,1,1,3,3,3,3,3,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,7,5,5,5,7,1,3,7,3,7,3,7,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,2,1,1,7,1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,2,1,1,7,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  2,1,1,3,1,7,1,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,2,1,1,8,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,2,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,8,7,3,3,1,1,3,3,3,3,3,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,2,1,1,1,8,7,3,3,1,1,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,8,7,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
+  1,1,7,1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,8,7,1,2,3,1,1,1,1,7,1,1,
+  7,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,8,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,3,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,
+  8,7,3,3,1,1,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,8,7,3,3,1,1,3,3,3,3,3,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,11
+};
+
+
+static const unsigned char ag_pstt[] = {
+113,3,4,1,2,2,17,17,16,16,16,16,16,16,16,16,16,25,24,23,22,21,0,0,9,9,9,9,8,
+  7,7,16,17,16,16,16,2,72,6,5,
+113,11,1,10,11,
+113,40,2,12,13,
+81,15,81,81,81,81,14,14,3,14,14,15,
+113,3,4,4,16,72,6,5,
+113,4,5,72,17,
+19,18,70,
+113,3,4,1,2,2,20,20,19,19,19,19,19,19,19,19,19,25,24,23,22,21,21,7,22,20,21,
+  18,19,20,19,19,19,2,72,20,6,5,
+113,1,2,2,25,17,17,16,16,16,16,16,16,16,16,16,25,24,23,22,21,8,24,6,24,23,
+  23,16,17,16,16,16,2,
+113,3,4,1,2,2,17,17,16,16,16,16,16,16,16,16,16,25,24,23,22,21,1,9,3,3,3,8,7,
+  7,16,17,16,16,16,2,72,6,5,
+65,65,65,65,65,65,65,65,65,65,41,65,65,65,65,65,65,65,65,65,65,65,65,65,65,
+  65,65,65,10,
+26,11,
+44,44,44,44,44,44,44,44,44,44,41,44,44,44,44,44,44,44,44,44,44,44,44,44,44,
+  44,44,44,12,
+42,13,27,
+86,86,82,86,
+3,83,84,
+73,16,
+19,18,71,
+113,29,1,2,2,17,17,16,16,16,16,16,16,16,16,16,25,24,23,22,21,18,30,30,16,17,
+  16,16,16,2,28,32,28,29,31,31,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,49,38,19,37,49,49,49,39,48,
+  47,46,45,44,43,42,41,40,39,39,37,34,37,37,
+50,11,
+12,21,
+113,1,51,2,2,25,17,17,16,16,16,16,16,16,16,16,16,25,24,23,22,21,51,52,8,52,
+  23,23,16,17,16,16,16,2,
+113,3,4,1,2,2,20,20,19,19,19,19,19,19,19,19,19,25,24,23,22,21,21,23,53,20,
+  21,18,19,20,19,19,19,2,72,20,6,5,
+113,1,2,2,25,17,17,16,16,16,16,16,16,16,16,16,25,24,23,22,21,24,14,7,23,23,
+  16,17,16,16,16,2,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,57,58,59,60,61,62,63,64,65,67,68,
+  113,34,123,38,1,2,2,71,25,17,17,16,16,16,16,16,16,16,16,16,25,24,23,22,
+  21,66,25,70,54,70,54,23,23,16,17,16,16,16,2,69,56,70,70,70,70,70,56,66,
+  70,71,56,55,48,47,46,45,44,43,42,41,40,39,39,37,34,37,37,
+113,26,72,73,73,
+74,27,
+75,79,
+80,29,
+113,3,76,92,78,1,92,2,2,20,20,19,19,19,19,19,19,19,19,19,25,24,23,22,21,30,
+  91,18,19,20,19,19,19,2,72,6,79,94,94,77,
+80,87,
+77,32,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,81,33,37,194,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,34,37,193,193,37,34,37,
+  37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,82,35,37,192,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,82,36,37,191,37,34,37,37,
+83,84,210,209,86,85,190,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,1,2,2,88,88,88,88,88,88,
+  88,88,88,88,88,38,88,88,88,88,88,2,37,88,87,89,87,87,55,48,47,46,45,44,
+  43,42,41,40,39,39,37,34,37,37,
+90,91,92,181,
+93,94,178,
+95,96,173,
+97,98,99,100,170,
+101,102,168,
+103,166,
+104,164,
+105,162,
+106,160,
+107,108,157,
+76,49,
+113,3,4,50,53,72,50,6,5,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,109,51,37,52,52,52,55,
+  48,47,46,45,44,43,42,41,40,39,39,37,34,37,37,
+113,1,2,2,25,17,17,16,16,16,16,16,16,16,16,16,25,24,23,22,21,52,14,9,23,23,
+  16,17,16,16,16,2,
+51,51,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,57,58,59,60,61,62,63,64,65,67,68,
+  113,34,123,38,1,2,2,110,25,17,17,16,16,16,16,16,16,16,16,16,25,24,23,22,
+  21,66,54,70,14,70,23,23,16,17,16,16,16,2,69,56,70,70,70,70,70,56,66,70,
+  110,56,55,48,47,46,45,44,43,42,41,40,39,39,37,34,37,37,
+111,111,111,111,111,111,111,111,111,111,111,188,111,
+112,124,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,113,57,37,56,56,113,56,
+  55,48,47,46,45,44,43,42,41,40,39,39,37,34,37,37,
+140,58,
+139,59,
+113,60,114,
+115,61,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,57,58,59,60,61,62,63,64,65,67,68,
+  113,34,38,25,66,62,116,116,69,56,116,116,116,116,116,56,66,56,55,48,47,
+  46,45,44,43,42,41,40,39,39,37,34,37,37,
+117,63,
+118,64,
+119,65,
+125,66,
+120,67,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,68,37,121,121,39,48,47,
+  46,45,44,43,42,41,40,39,39,37,34,37,37,
+122,211,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,57,58,59,60,61,62,63,64,65,67,68,
+  113,34,123,38,127,25,66,70,131,131,69,56,131,131,131,131,131,56,66,56,
+  55,48,47,46,45,44,43,42,41,40,39,39,37,34,37,37,
+128,71,
+123,68,
+124,64,73,
+113,1,2,2,125,125,125,125,125,125,125,125,125,125,125,74,125,125,125,125,
+  125,2,126,126,125,
+113,75,96,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,127,38,76,37,127,127,127,
+  39,48,47,46,45,44,43,42,41,40,39,39,37,34,37,37,
+129,128,104,
+113,3,76,130,78,1,2,2,17,17,16,16,16,16,16,16,16,16,16,25,24,23,22,21,78,16,
+  30,30,16,17,16,16,16,2,72,6,79,130,31,31,131,77,130,
+113,76,78,103,72,17,132,
+113,88,1,2,2,17,17,16,16,16,16,16,16,16,16,16,25,24,23,22,21,80,30,30,16,17,
+  16,16,16,2,90,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,1,2,2,88,88,88,88,88,88,
+  88,88,88,88,88,81,88,88,88,88,88,2,37,88,87,133,87,87,55,48,47,46,45,44,
+  43,42,41,40,39,39,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,82,37,87,87,87,55,48,47,
+  46,45,44,43,42,41,40,39,39,37,34,37,37,
+113,83,208,
+113,84,207,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,135,38,85,37,134,134,55,48,
+  47,46,45,44,43,42,41,40,39,39,37,34,37,134,135,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,86,37,136,136,136,55,48,
+  47,46,45,44,43,42,41,40,39,39,37,34,37,37,
+214,112,87,
+113,3,76,92,137,1,2,2,57,57,56,56,56,56,56,56,56,56,56,88,56,57,56,56,56,2,
+  138,102,102,77,
+139,89,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,90,37,187,187,37,34,37,
+  37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,91,37,186,186,37,34,37,
+  37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,92,37,185,185,37,34,37,
+  37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,93,37,140,140,140,37,34,
+  37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,94,37,141,141,141,37,34,
+  37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,95,37,39,142,39,39,37,
+  34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,96,37,39,143,39,39,37,
+  34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,97,37,39,144,40,39,39,
+  37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,98,37,39,145,40,39,39,
+  37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,99,37,39,146,40,39,39,
+  37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,100,37,39,147,40,39,39,
+  37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,101,37,39,148,41,40,39,
+  39,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,102,37,39,149,41,40,39,
+  39,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,103,37,39,150,42,41,40,
+  39,39,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,104,37,39,151,43,42,41,
+  40,39,39,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,105,37,39,152,44,43,42,
+  41,40,39,39,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,106,37,39,153,45,44,43,
+  42,41,40,39,39,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,107,37,39,154,46,45,44,
+  43,42,41,40,39,39,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,108,37,155,155,155,55,
+  48,47,46,45,44,43,42,41,40,39,39,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,109,109,37,156,156,156,
+  156,55,48,47,46,45,44,43,42,41,40,39,39,37,34,37,37,
+129,110,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,111,37,145,145,55,48,47,
+  46,45,44,43,42,41,40,39,39,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,112,37,143,143,55,48,47,
+  46,45,44,43,42,41,40,39,39,37,34,37,37,
+141,113,
+138,114,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,157,115,37,56,56,157,56,
+  55,48,47,46,45,44,43,42,41,40,39,39,37,34,37,37,
+158,116,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,117,37,159,159,159,55,
+  48,47,46,45,44,43,42,41,40,39,39,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,118,37,160,160,160,55,
+  48,47,46,45,44,43,42,41,40,39,39,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,119,37,161,161,161,55,
+  48,47,46,45,44,43,42,41,40,39,39,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,57,58,59,60,61,62,63,64,65,67,68,
+  113,34,38,25,66,120,122,122,69,56,122,122,122,122,122,56,66,56,55,48,47,
+  46,45,44,43,42,41,40,39,39,37,34,37,37,
+162,121,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,57,58,59,60,61,62,63,64,65,67,68,
+  113,34,38,25,66,122,120,120,69,56,120,120,120,120,120,56,66,56,55,48,47,
+  46,45,44,43,42,41,40,39,39,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,123,37,69,69,39,48,47,
+  46,45,44,43,42,41,40,39,39,37,34,37,37,
+113,124,72,67,
+113,3,4,1,163,2,2,57,57,56,56,56,56,56,56,56,56,56,125,164,56,57,56,56,56,2,
+  72,165,165,163,6,5,
+113,1,2,2,43,125,125,125,125,125,125,125,125,125,125,125,126,125,125,125,
+  125,125,2,48,125,
+107,127,
+113,166,1,2,2,17,17,16,16,16,16,16,16,16,16,16,25,24,23,22,21,128,30,30,16,
+  17,16,16,16,2,166,31,31,166,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,167,38,129,37,167,167,167,
+  39,48,47,46,45,44,43,42,41,40,39,39,37,34,37,37,
+111,130,
+106,131,
+129,128,105,
+195,133,
+168,205,
+206,135,
+203,112,136,
+113,3,76,130,137,1,2,2,17,17,16,16,16,16,16,16,16,16,16,25,24,23,22,21,137,
+  30,30,16,17,16,16,16,2,138,130,31,31,131,77,130,
+76,137,103,132,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,139,37,189,189,37,34,37,
+  37,
+90,91,92,183,
+90,91,92,182,
+93,94,180,
+93,94,179,
+95,96,177,
+95,96,176,
+95,96,175,
+95,96,174,
+97,98,99,100,172,
+97,98,99,100,171,
+101,102,169,
+103,167,
+104,165,
+105,163,
+106,161,
+169,112,155,
+170,98,156,
+171,157,
+172,158,
+173,112,159,
+174,112,160,
+175,112,161,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,57,58,59,60,61,62,63,64,65,67,68,
+  113,34,38,25,66,162,121,121,69,56,121,121,121,121,121,56,66,56,55,48,47,
+  46,45,44,43,42,41,40,39,39,37,34,37,37,
+176,163,
+62,60,60,164,
+177,53,165,
+112,166,
+108,167,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,168,37,216,216,55,48,47,
+  46,45,44,43,42,41,40,39,39,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,169,37,158,39,48,47,46,
+  45,44,43,42,41,40,39,39,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,99,109,170,37,101,101,
+  101,55,48,47,46,45,44,43,42,41,40,39,39,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,178,171,37,56,56,178,56,
+  55,48,47,46,45,44,43,42,41,40,39,39,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,172,37,179,179,179,55,
+  48,47,46,45,44,43,42,41,40,39,39,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,57,58,59,60,61,62,63,64,65,67,68,
+  113,34,38,25,66,173,135,135,69,56,135,135,135,135,135,56,66,56,55,48,47,
+  46,45,44,43,42,41,40,39,39,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,57,58,59,60,61,62,63,64,65,67,68,
+  113,34,38,25,66,174,134,134,69,56,134,134,134,134,134,56,66,56,55,48,47,
+  46,45,44,43,42,41,40,39,39,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,57,58,59,60,61,62,63,64,65,67,68,
+  113,34,38,25,66,175,180,180,69,56,180,180,180,180,180,56,66,56,55,48,47,
+  46,45,44,43,42,41,40,39,39,37,34,37,37,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,38,176,37,63,63,39,48,47,
+  46,45,44,43,42,41,40,39,39,37,34,37,37,
+113,3,4,163,177,164,72,59,163,6,5,
+181,178,
+182,112,179,
+183,132,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,113,34,184,38,181,37,56,56,184,56,
+  55,48,47,46,45,44,43,42,41,40,39,39,37,34,37,37,
+136,182,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,57,58,59,60,61,62,63,64,65,67,68,
+  113,34,38,25,66,183,133,133,69,56,133,133,133,133,133,56,66,56,55,48,47,
+  46,45,44,43,42,41,40,39,39,37,34,37,37,
+185,184,
+37,37,37,37,37,37,34,34,33,35,36,34,34,34,57,58,59,60,61,62,63,64,65,67,68,
+  113,34,38,25,66,185,137,137,69,56,137,137,137,137,137,56,66,56,55,48,47,
+  46,45,44,43,42,41,40,39,39,37,34,37,37,
+  0
+};
+
+
+static const unsigned short ag_sbt[] = {
+     0,  40,  45,  50,  62,  70,  75,  78, 116, 149, 188, 217, 219, 248,
+   251, 255, 258, 260, 263, 299, 338, 340, 342, 376, 414, 446, 538, 543,
+   545, 547, 549, 589, 591, 593, 617, 642, 666, 690, 697, 757, 761, 764,
+   767, 772, 775, 777, 779, 781, 783, 786, 788, 797, 836, 868, 870, 961,
+   974, 976,1016,1018,1020,1023,1025,1084,1086,1088,1090,1092,1094,1131,
+  1133,1194,1196,1198,1201,1226,1229,1268,1271,1314,1321,1352,1412,1450,
+  1453,1456,1496,1534,1537,1567,1569,1594,1619,1644,1670,1696,1723,1750,
+  1778,1806,1834,1862,1891,1920,1950,1981,2013,2046,2080,2118,2158,2160,
+  2197,2234,2236,2238,2278,2280,2318,2356,2394,2453,2455,2514,2551,2555,
+  2587,2612,2614,2648,2687,2689,2691,2694,2696,2698,2700,2703,2743,2747,
+  2772,2776,2780,2783,2786,2789,2792,2795,2798,2803,2808,2811,2813,2815,
+  2817,2819,2822,2825,2827,2829,2832,2835,2838,2897,2899,2903,2906,2908,
+  2910,2947,2983,3023,3063,3101,3160,3219,3278,3315,3326,3328,3331,3333,
+  3373,3375,3434,3436,3495
+};
+
+
+static const unsigned short ag_sbe[] = {
+    22,  42,  47,  58,  65,  72,  77, 101, 137, 172, 216, 218, 247, 249,
+   253, 256, 259, 262, 284, 317, 339, 341, 364, 399, 435, 497, 539, 544,
+   546, 548, 574, 590, 592, 610, 634, 659, 683, 696, 728, 760, 763, 766,
+   771, 774, 776, 778, 780, 782, 785, 787, 791, 815, 857, 869, 921, 972,
+   975, 994,1017,1019,1021,1024,1055,1085,1087,1089,1091,1093,1111,1132,
+  1165,1195,1197,1200,1216,1227,1247,1270,1295,1317,1342,1383,1429,1451,
+  1454,1474,1513,1536,1556,1568,1586,1611,1636,1661,1687,1713,1740,1767,
+  1795,1823,1851,1879,1908,1937,1967,1998,2030,2063,2097,2136,2159,2177,
+  2214,2235,2237,2256,2279,2297,2335,2373,2424,2454,2485,2531,2552,2573,
+  2603,2613,2635,2666,2688,2690,2693,2695,2697,2699,2702,2727,2745,2764,
+  2775,2779,2782,2785,2788,2791,2794,2797,2802,2807,2810,2812,2814,2816,
+  2818,2821,2824,2826,2828,2831,2834,2837,2868,2898,2902,2905,2907,2909,
+  2927,2964,3002,3041,3080,3131,3190,3249,3295,3319,3327,3330,3332,3351,
+  3374,3405,3435,3466,3495
+};
+
+
+static const unsigned char ag_fl[] = {
+  1,2,1,2,1,1,2,3,3,4,0,1,3,1,2,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,0,1,0,6,2,1,1,1,2,1,3,1,3,3,1,1,2,2,1,3,1,0,1,3,5,2,1,3,1,3,
+  1,2,1,3,0,1,4,4,0,1,4,0,1,2,3,1,2,1,3,1,3,2,0,1,2,1,3,1,3,4,1,3,2,1,1,
+  2,3,3,4,0,1,3,4,1,1,1,1,1,1,1,3,4,3,0,1,2,0,1,3,4,1,2,5,7,5,5,7,9,3,2,
+  2,3,1,3,1,3,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,3,1,3,1,3,1,3,1,3,1,3,3,1,3,
+  3,3,3,1,3,3,1,3,3,1,3,3,3,1,4,1,2,2,2,2,4,1,1,1,1,1,1,1,4,0,1,4,3,3,2,
+  2,1,1,1,3,1,3,1,1,1,1,1
+};
+
+static const unsigned char ag_ptt[] = {
+    0,  1,  3,  3,  5,  5,  6,  6,  6,  6, 13, 13,  7, 10, 10, 11, 11, 11,
+   11, 11, 11, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+   16, 16, 17, 17, 39, 39, 40, 32, 32, 37, 37, 42, 42, 12, 12, 47, 47, 46,
+   51, 51, 51, 51, 52, 52, 53, 54, 54, 53, 33, 33, 58, 58, 59, 59,  8,  8,
+   60, 60, 65, 65, 60, 60, 69, 69, 60, 72, 72, 61, 61, 71, 71, 67, 67, 73,
+   73, 75, 77, 77, 75, 68, 68, 50, 50, 50, 79, 79, 80, 76, 76, 76, 81, 81,
+   81, 82, 82, 81, 81, 38,  2,  2,  2,  2,  2,  2, 84, 84, 84, 92, 92, 85,
+   94, 94,  9,  9, 93, 93, 86, 86, 86, 87, 87, 87, 88, 88, 88, 88, 91, 91,
+   78, 78,107,107,107,107,107,107,107,107,107,107,107,105,105, 56,118,118,
+  120,120,122,122,124,124,126,126,128,128,128,130,130,130,130,130,133,133,
+  133,138,138,138,141,141,141,141,144,144,106,106,106,106,106,106,150,150,
+  150,150,150,150,147,147,156,156,147,147,147,147,147,154,154,154,154,155,
+  155,159,159,159,159,159
+};
+
+static const unsigned char  *ag_valid(int ag_k) {
+  const unsigned char  *ag_tp = &ag_tstt[ag_sbt[(PCB).sn+1]];
+  while (*--ag_tp != (unsigned char) ag_k) if (*ag_tp == 0) return NULL;
+  return ag_tp;
+}
+
+int cc_change_reduction(cc_token_type ag_k) {
+  if (!ag_valid(ag_k)) return 0;
+  (PCB).reduction_token = ag_k;
+  return 1;
+}
+
+static void ag_default(const  int *ag_tp) {
+  (PCB).ag_dsn = (PCB).sn;
+  (PCB).ag_dtl = ag_tp;
+  while (!ag_valid((cc_token_type) *ag_tp)) ag_tp++;
+  (PCB).reduction_token = (cc_token_type) *ag_tp;
+}
+
+
+
+static void ag_ra(void)
+{
+  switch(ag_rpx[(PCB).ag_ap]) {
+    case 1: ag_rp_1(V(0,(int *))); break;
+    case 2: V(0,(int *)) = ag_rp_2(); break;
+    case 3: V(0,(int *)) = ag_rp_3(); break;
+    case 4: V(0,(int *)) = ag_rp_4(V(0,(int *)), V(1,(int *))); break;
+    case 5: V(0,(int *)) = ag_rp_5(); break;
+    case 6: V(0,(int *)) = ag_rp_6(); break;
+    case 7: V(0,(int *)) = ag_rp_7(); break;
+    case 8: V(0,(int *)) = ag_rp_8(); break;
+    case 9: V(0,(int *)) = ag_rp_9(); break;
+    case 10: ag_rp_10(); break;
+    case 11: ag_rp_11(); break;
+    case 12: ag_rp_12(V(0,(token *))); break;
+    case 13: ag_default(&ag_rtt[0]); V(0,(token *)) = ag_rp_13(V(0,(token *))); break;
+  }
+}
+
+#define TOKEN_NAMES cc_token_names
+const char *const cc_token_names[166] = {
+  "program",
+  "program",
+  "statement",
+  "translation unit",
+  "eof",
+  "external declaration",
+  "function definition",
+  "declaration",
+  "declarator",
+  "compound statement",
+  "declaration list",
+  "declaration specifiers",
+  "init declarator list",
+  "",
+  "';'",
+  "storage class specifier",
+  "type specifier",
+  "type qualifier",
+  "AUTO",
+  "REGISTER",
+  "STATIC",
+  "EXTERN",
+  "TYPEDEF",
+  "VOIDkey",
+  "CHAR",
+  "SHORT",
+  "INT",
+  "LONG",
+  "FLOAT",
+  "DOUBLE",
+  "SIGNED",
+  "UNSIGNED",
+  "struct or union specifier",
+  "enum specifier",
+  "typedef name",
+  "CONSTANT",
+  "VOLATILE",
+  "struct or union",
+  "identifier",
+  "",
+  "",
+  "'{'",
+  "struct declaration list",
+  "'}'",
+  "STRUCT",
+  "UNION",
+  "struct declaration",
+  "init declarator",
+  "','",
+  "'='",
+  "initializer",
+  "specifier qualifier list",
+  "struct declarator list",
+  "struct declarator",
+  "",
+  "':'",
+  "constant expression",
+  "ENUM",
+  "enumerator list",
+  "enumerator",
+  "direct declarator",
+  "pointer",
+  "'('",
+  "')'",
+  "'['",
+  "",
+  "']'",
+  "parameter type list",
+  "identifier list",
+  "",
+  "'*'",
+  "type qualifier list",
+  "",
+  "parameter list",
+  "ELLIPSIS",
+  "parameter declaration",
+  "abstract declarator",
+  "",
+  "assignment expression",
+  "initializer list",
+  "type name",
+  "direct abstract declarator",
+  "",
+  "NAME",
+  "labeled statement",
+  "expression statement",
+  "selection statement",
+  "iteration statement",
+  "jump statement",
+  "CASE",
+  "DEFAULT",
+  "expression",
+  "",
+  "statement list",
+  "",
+  "IF",
+  "ELSE",
+  "SWITCH",
+  "WHILE",
+  "DO",
+  "FOR",
+  "GOTO",
+  "CONTINUE",
+  "BREAK",
+  "RETURN",
+  "conditional expression",
+  "unary expression",
+  "assignment operator",
+  "MULTassign",
+  "DIVassign",
+  "MODassign",
+  "PLUSassign",
+  "MINUSassign",
+  "LSassign",
+  "RSassign",
+  "ANDassign",
+  "ORassign",
+  "ERassign",
+  "logical or expression",
+  "'\\?'",
+  "logical and expression",
+  "OROR",
+  "inclusive or expression",
+  "ANDAND",
+  "exclusive or expression",
+  "'|'",
+  "and expression",
+  "'^'",
+  "equality expression",
+  "'&'",
+  "relational expression",
+  "EQ",
+  "NE",
+  "shift expression",
+  "'<'",
+  "'>'",
+  "LE",
+  "GE",
+  "additive expression",
+  "LS",
+  "RS",
+  "multiplicative expression",
+  "'+'",
+  "'-'",
+  "cast expression",
+  "'/'",
+  "'%'",
+  "postfix expression",
+  "ICR",
+  "DECR",
+  "unary operator",
+  "SIZEOF",
+  "'~'",
+  "'!'",
+  "primary expression",
+  "argument expression list",
+  "",
+  "'.'",
+  "ARROW",
+  "constant",
+  "STRINGliteral",
+  "HEXconstant",
+  "OCTconstant",
+  "DECconstant",
+  "FLOATconstant",
+  "CHARACTERconstant",
+
+};
+
+#ifndef MISSING_FORMAT
+#define MISSING_FORMAT "Missing %s"
+#endif
+#ifndef UNEXPECTED_FORMAT
+#define UNEXPECTED_FORMAT "Unexpected %s"
+#endif
+#ifndef UNNAMED_TOKEN
+#define UNNAMED_TOKEN "input"
+#endif
+
+
+static void ag_diagnose(void) {
+  int ag_snd = (PCB).sn;
+  int ag_k = ag_sbt[ag_snd];
+
+  if (*TOKEN_NAMES[ag_tstt[ag_k]] && ag_astt[ag_k + 1] == ag_action_8) {
+    sprintf((PCB).ag_msg, MISSING_FORMAT, TOKEN_NAMES[ag_tstt[ag_k]]);
+  }
+  else if (ag_astt[ag_sbe[(PCB).sn]] == ag_action_8
+          && (ag_k = (int) ag_sbe[(PCB).sn] + 1) == (int) ag_sbt[(PCB).sn+1] - 1
+          && *TOKEN_NAMES[ag_tstt[ag_k]]) {
+    sprintf((PCB).ag_msg, MISSING_FORMAT, TOKEN_NAMES[ag_tstt[ag_k]]);
+  }
+  else if ((PCB).token_number && *TOKEN_NAMES[(PCB).token_number]) {
+    sprintf((PCB).ag_msg, UNEXPECTED_FORMAT, TOKEN_NAMES[(PCB).token_number]);
+  }
+  else if (isprint(((PCB).input_code)) && ((PCB).input_code) != '\\') {
+    char buf[20];
+    sprintf(buf, "\'%c\'", (char) ((PCB).input_code));
+    sprintf((PCB).ag_msg, UNEXPECTED_FORMAT, buf);
+  }
+  else sprintf((PCB).ag_msg, UNEXPECTED_FORMAT, UNNAMED_TOKEN);
+  (PCB).error_message = (PCB).ag_msg;
+
+
+}
+static int ag_action_1_r_proc(void);
+static int ag_action_2_r_proc(void);
+static int ag_action_3_r_proc(void);
+static int ag_action_4_r_proc(void);
+static int ag_action_1_s_proc(void);
+static int ag_action_3_s_proc(void);
+static int ag_action_1_proc(void);
+static int ag_action_2_proc(void);
+static int ag_action_3_proc(void);
+static int ag_action_4_proc(void);
+static int ag_action_5_proc(void);
+static int ag_action_6_proc(void);
+static int ag_action_7_proc(void);
+static int ag_action_8_proc(void);
+static int ag_action_9_proc(void);
+static int ag_action_10_proc(void);
+static int ag_action_11_proc(void);
+static int ag_action_8_proc(void);
+
+
+static int (*const  ag_r_procs_scan[])(void) = {
+  ag_action_1_r_proc,
+  ag_action_2_r_proc,
+  ag_action_3_r_proc,
+  ag_action_4_r_proc
+};
+
+static int (*const  ag_s_procs_scan[])(void) = {
+  ag_action_1_s_proc,
+  ag_action_2_r_proc,
+  ag_action_3_s_proc,
+  ag_action_4_r_proc
+};
+
+static int (*const  ag_gt_procs_scan[])(void) = {
+  ag_action_1_proc,
+  ag_action_2_proc,
+  ag_action_3_proc,
+  ag_action_4_proc,
+  ag_action_5_proc,
+  ag_action_6_proc,
+  ag_action_7_proc,
+  ag_action_8_proc,
+  ag_action_9_proc,
+  ag_action_10_proc,
+  ag_action_11_proc,
+  ag_action_8_proc
+};
+
+
+static int ag_action_10_proc(void) {
+  (PCB).btsx = 0, (PCB).drt = -1;
+  ag_track();
+  return 0;
+}
+
+static int ag_action_11_proc(void) {
+  (PCB).btsx = 0, (PCB).drt = -1;
+  (*(token *) &(PCB).vs[(PCB).ssx]) = (PCB).input_value;
+  (PCB).ssx--;
+  ag_ra();
+  (PCB).ssx++;
+  ag_track();
+  return 0;
+}
+
+static int ag_action_3_r_proc(void) {
+  int ag_sd = ag_fl[(PCB).ag_ap] - 1;
+  if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
+  (PCB).btsx = 0, (PCB).drt = -1;
+  (PCB).reduction_token = (cc_token_type) ag_ptt[(PCB).ag_ap];
+  ag_ra();
+  return (PCB).exit_flag == AG_RUNNING_CODE;
+}
+
+static int ag_action_3_s_proc(void) {
+  int ag_sd = ag_fl[(PCB).ag_ap] - 1;
+  if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
+  (PCB).btsx = 0, (PCB).drt = -1;
+  (PCB).reduction_token = (cc_token_type) ag_ptt[(PCB).ag_ap];
+  ag_ra();
+  return (PCB).exit_flag == AG_RUNNING_CODE;
+}
+
+static int ag_action_4_r_proc(void) {
+  int ag_sd = ag_fl[(PCB).ag_ap] - 1;
+  if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
+  (PCB).reduction_token = (cc_token_type) ag_ptt[(PCB).ag_ap];
+  return 1;
+}
+
+static int ag_action_2_proc(void) {
+  (PCB).btsx = 0, (PCB).drt = -1;
+  if ((PCB).ssx >= 128) {
+    ag_trace_error();
+    (PCB).exit_flag = AG_STACK_ERROR_CODE;
+    PARSER_STACK_OVERFLOW;
+  }
+  (*(token *) &(PCB).vs[(PCB).ssx]) = (PCB).input_value;
+  (PCB).ss[(PCB).ssx] = (PCB).sn;
+  (PCB).ssx++;
+  (PCB).sn = (PCB).ag_ap;
+  ag_track();
+  return 0;
+}
+
+static int ag_action_9_proc(void) {
+  if ((PCB).drt == -1) {
+    (PCB).drt=(PCB).token_number;
+    (PCB).dssx=(PCB).ssx;
+    (PCB).dsn=(PCB).sn;
+  }
+  ag_prot();
+  (PCB).ss[(PCB).ssx] = (PCB).sn;
+  (PCB).ssx++;
+  (PCB).sn = (PCB).ag_ap;
+  return (PCB).exit_flag == AG_RUNNING_CODE;
+}
+
+static int ag_action_2_r_proc(void) {
+  (PCB).ssx++;
+  (PCB).sn = (PCB).ag_ap;
+  return 0;
+}
+
+static int ag_action_7_proc(void) {
+  --(PCB).ssx;
+  (PCB).exit_flag = AG_SUCCESS_CODE;
+  return 0;
+}
+
+static int ag_action_1_proc(void) {
+  (PCB).exit_flag = AG_SUCCESS_CODE;
+  ag_track();
+  return 0;
+}
+
+static int ag_action_1_r_proc(void) {
+  (PCB).exit_flag = AG_SUCCESS_CODE;
+  return 0;
+}
+
+static int ag_action_1_s_proc(void) {
+  (PCB).exit_flag = AG_SUCCESS_CODE;
+  return 0;
+}
+
+static int ag_action_4_proc(void) {
+  int ag_sd = ag_fl[(PCB).ag_ap] - 1;
+  (PCB).reduction_token = (cc_token_type) ag_ptt[(PCB).ag_ap];
+  (PCB).btsx = 0, (PCB).drt = -1;
+  (*(token *) &(PCB).vs[(PCB).ssx]) = (PCB).input_value;
+  if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
+  else (PCB).ss[(PCB).ssx] = (PCB).sn;
+  ag_track();
+  while ((PCB).exit_flag == AG_RUNNING_CODE) {
+    unsigned ag_t1 = ag_sbe[(PCB).sn] + 1;
+    unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1;
+    do {
+      unsigned ag_tx = (ag_t1 + ag_t2)/2;
+      if (ag_tstt[ag_tx] < (unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1;
+      else ag_t2 = ag_tx;
+    } while (ag_t1 < ag_t2);
+    if (ag_tstt[ag_t1] != (PCB).reduction_token) {
+      (PCB).exit_flag = AG_REDUCTION_ERROR_CODE; ag_trace_error();
+      REDUCTION_TOKEN_ERROR; break;}
+      (PCB).ag_ap = ag_pstt[ag_t1];
+    if ((ag_s_procs_scan[ag_astt[ag_t1]])() == 0) break;
+  }
+  return 0;
+}
+
+static int ag_action_3_proc(void) {
+  int ag_sd = ag_fl[(PCB).ag_ap] - 1;
+  (PCB).btsx = 0, (PCB).drt = -1;
+  (*(token *) &(PCB).vs[(PCB).ssx]) = (PCB).input_value;
+  if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
+  else (PCB).ss[(PCB).ssx] = (PCB).sn;
+  ag_track();
+  (PCB).reduction_token = (cc_token_type) ag_ptt[(PCB).ag_ap];
+  ag_ra();
+  while ((PCB).exit_flag == AG_RUNNING_CODE) {
+    unsigned ag_t1 = ag_sbe[(PCB).sn] + 1;
+    unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1;
+    do {
+      unsigned ag_tx = (ag_t1 + ag_t2)/2;
+      if (ag_tstt[ag_tx] < (unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1;
+      else ag_t2 = ag_tx;
+    } while (ag_t1 < ag_t2);
+    if (ag_tstt[ag_t1] != (PCB).reduction_token) {
+      (PCB).exit_flag = AG_REDUCTION_ERROR_CODE; ag_trace_error();
+      REDUCTION_TOKEN_ERROR; break;}
+      (PCB).ag_ap = ag_pstt[ag_t1];
+    if ((ag_s_procs_scan[ag_astt[ag_t1]])() == 0) break;
+  }
+  return 0;
+}
+
+static int ag_action_8_proc(void) {
+  ag_undo();
+  ag_trace_error();
+  (PCB).exit_flag = AG_SYNTAX_ERROR_CODE;
+  ag_diagnose();
+  SYNTAX_ERROR;
+  ag_track();
+  return (PCB).exit_flag == AG_RUNNING_CODE;
+}
+
+static int ag_action_5_proc(void) {
+  int ag_sd = ag_fl[(PCB).ag_ap];
+  (PCB).btsx = 0, (PCB).drt = -1;
+  if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
+  else {
+    (PCB).ss[(PCB).ssx] = (PCB).sn;
+  }
+  (PCB).reduction_token = (cc_token_type) ag_ptt[(PCB).ag_ap];
+  ag_ra();
+  while ((PCB).exit_flag == AG_RUNNING_CODE) {
+    unsigned ag_t1 = ag_sbe[(PCB).sn] + 1;
+    unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1;
+    do {
+      unsigned ag_tx = (ag_t1 + ag_t2)/2;
+      if (ag_tstt[ag_tx] < (unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1;
+      else ag_t2 = ag_tx;
+    } while (ag_t1 < ag_t2);
+    if (ag_tstt[ag_t1] != (PCB).reduction_token) {
+      (PCB).exit_flag = AG_REDUCTION_ERROR_CODE; ag_trace_error();
+      REDUCTION_TOKEN_ERROR; break;}
+      (PCB).ag_ap = ag_pstt[ag_t1];
+    if ((ag_r_procs_scan[ag_astt[ag_t1]])() == 0) break;
+  }
+  return (PCB).exit_flag == AG_RUNNING_CODE;
+}
+
+static int ag_action_6_proc(void) {
+  int ag_sd = ag_fl[(PCB).ag_ap];
+  (PCB).reduction_token = (cc_token_type) ag_ptt[(PCB).ag_ap];
+  if ((PCB).drt == -1) {
+    (PCB).drt=(PCB).token_number;
+    (PCB).dssx=(PCB).ssx;
+    (PCB).dsn=(PCB).sn;
+  }
+  if (ag_sd) {
+    (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
+  }
+  else {
+    ag_prot();
+    (PCB).vs[(PCB).ssx] = ag_null_value;
+    (PCB).ss[(PCB).ssx] = (PCB).sn;
+  }
+  while ((PCB).exit_flag == AG_RUNNING_CODE) {
+    unsigned ag_t1 = ag_sbe[(PCB).sn] + 1;
+    unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1;
+    do {
+      unsigned ag_tx = (ag_t1 + ag_t2)/2;
+      if (ag_tstt[ag_tx] < (unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1;
+      else ag_t2 = ag_tx;
+    } while (ag_t1 < ag_t2);
+    if (ag_tstt[ag_t1] != (PCB).reduction_token) {
+      (PCB).exit_flag = AG_REDUCTION_ERROR_CODE; ag_trace_error();
+      REDUCTION_TOKEN_ERROR; break;}
+      (PCB).ag_ap = ag_pstt[ag_t1];
+    if ((ag_r_procs_scan[ag_astt[ag_t1]])() == 0) break;
+  }
+  return (PCB).exit_flag == AG_RUNNING_CODE;
+}
+
+
+void init_cc(void) {
+  unsigned ag_t1;
+  ag_t1 = 0;
+  (PCB).ss[0] = (PCB).sn = (PCB).ssx = 0;
+  (PCB).exit_flag = AG_RUNNING_CODE;
+  (PCB).line = FIRST_LINE;
+  (PCB).column = FIRST_COLUMN;
+  (PCB).btsx = 0, (PCB).drt = -1;
+  while (ag_tstt[ag_t1] == 0) {
+    (PCB).ag_ap = ag_pstt[ag_t1];
+    (ag_gt_procs_scan[ag_astt[ag_t1]])();
+    ag_t1 = ag_sbt[(PCB).sn];
+  }
+}
+
+void cc(void) {
+  (PCB).token_number = (cc_token_type) AG_TCV((PCB).input_code);
+  while (1) {
+    unsigned ag_t1 = ag_sbt[(PCB).sn];
+    unsigned ag_t2 = ag_sbe[(PCB).sn] - 1;
+    do {
+      unsigned ag_tx = (ag_t1 + ag_t2)/2;
+      if (ag_tstt[ag_tx] > (unsigned char)(PCB).token_number)
+        ag_t1 = ag_tx + 1;
+      else ag_t2 = ag_tx;
+    } while (ag_t1 < ag_t2);
+    if (ag_tstt[ag_t1] != (unsigned char)(PCB).token_number)
+      ag_t1 = ag_sbe[(PCB).sn];
+    (PCB).ag_ap = ag_pstt[ag_t1];
+    if ((ag_gt_procs_scan[ag_astt[ag_t1]])() == 0) break;
+  }
+}
+
+