/*
 dxi.syn -- Direct Execution Script Interpreter
 Copyright (c) 2002 Parsifal Software. All Rights Reserved.

 This version of dxi.syn implements CLL, a C-like language.
 Modified to support local function definitions.

 The grammar contained in this file describes the same language as the
 grammar in cll.syn. The differences can be categorized as follows:
   . Rules rewritten to make computation easier. In cll.syn all of the
     arithmetic operators have been factored out. Here the arithmetic
     operators have been substituted back into the rules for expressions to
     make computation more straightforward.
   . Rules rewritten to handle looping. The rules for loop constructs have
     been rewritten to handle repetitive parsing of loops.
   . Semantically determined rules (true, false) added to support parse time
     implementation of loops and if-else statements.

 The actual parser modules, dxi.h and dxi.cpp are created from
 dxi.syn by the AnaGram parser generator using the Build Parser command.

 To build a demonstration program for this parser, compile and link as a
 single project:
   demo.cpp                // Demo program
   comdefs.cpp             // Common script definitions
   dxi.cpp                 // Direct execution parser
   agclib1.lib             // Supporting class library
 Include files describing the class library are in agclib1\include

 This grammar describes a language that is similar to C.

 The language consists of C statements (not including declarations or the
 switch statement) and C expressions (not including pointers or subscript
 operators). The language also implements Fortran-style exponentiation and
 simple dump and print statements. The syntax below uses "open" and "closed"
 statements to eliminate the traditional "dangling else" or "if-else"
 ambiguity problem. See http://www.parsifalsoft.com/ifelse.html or
 doc/ifelse.htm for a more detailed discussion.

 Statement types supported are:
   expression statements
   compound statements
   if/else statements
   while statements
   do/while statements
   for statements
   break and continue statements
   dump and print statements

 There are no declarations. Scalar values may be explicitly cast to (long) or
 (double). Both integer and floating point values are stored as doubles.

 Scripts may contain any number of statements. White space may be used
 freely, including both C and C++ style comments.

 For further information about this program or the AnaGram
 parser generator, please contact:
   Parsifal Software
   http://www.parsifalsoft.com
   info@parsifalsoft.com
   +1-800-879-2577, Voice/Fax +1-508-358-2564
   P.O. Box 219
   Wayland, Massachusetts 01778
   USA
*/

#include "comdefs.h"                // Contains definitions of support classes
#include <math.h>
#include <iostream.h>                     // Used by dump and print statements

/*
 It is sometimes necessary to skip over code without executing it. The Mode
 enumeration specifies the various execution modes.
*/
enum Mode {
  executeMode,                                                    // executing
  continueMode,         // continue statement encountered, skip to end of loop
  breakMode,               // break statement encountered, skip to end of loop
  elseMode,                                      // Skipping to else statement
  blockMode,                                       // skipping a block of code
  scanMode                       // scanning code to determine loop parameters
};

/*
 The parser uses "pointer input". The ParseContext struct is used to store
 the value of the pointer and the execution mode at critical locations in the
 script, such as at the head of a loop, at the exit point of a loop, or at
 the increment and condition fields of a for loop. Since ParseContext
 inherits from FileLocation, it also stores line and column number.

 In the configuration section of the parser, the "context type" is specified
 as ParseContext. The GET_CONTEXT macro constructs a ParseContext object to
 store on the context stack.

 dxi_pcb_struct is the "parser control block". The ParseContext constructor
 retrieves the necessary information from the pcb.
*/
struct dxi_pcb_struct;          // Because of forward reference in constructor
struct ParseContext : public FileLocation {
  Mode mode;
  ParseContext() : FileLocation(), mode(executeMode) {}
  ParseContext(const char *key)
    : FileLocation((const unsigned char *) key), mode(executeMode) {}
  ParseContext(dxi_pcb_struct &);
};

/*
 The VALUE macro controls the execution of expressions in accordance with the
 current execution mode.
*/
#define VALUE(x) PCB.mode == executeMode ? Value(x) : Value()

/*
AnaGram, A System for Syntax Directed Programming
Copyright (c) 1993-2002, Parsifal Software.
All Rights Reserved.

Version 2.01.08a   Feb 28 2002

Serial number 2P17253
Registered to:
  Parsifal Software
  AnaGram 2.01.08a Master
*/

#ifndef DXI_H_1031146266
#include "dxi.h"
#endif

#ifndef DXI_H_1031146266
#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])


#ifndef PCB_TYPE
#define PCB_TYPE dxi_pcb_type
#endif


#define PCB (*pcb_pointer)
#define PCB_DECL PCB_TYPE *pcb_pointer
#define PCB_POINTER pcb_pointer

Value dxi_value(PCB_DECL);

static void ag_delete_wrappers(PCB_DECL);
#ifndef DELETE_WRAPPERS
#define DELETE_WRAPPERS ag_delete_wrappers(PCB_POINTER)
#endif

/*  Line 616, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
 // Begin embedded C++

// Don't use default error handling.
#define SYNTAX_ERROR PCB.reportError()

// implement context tracking
#define GET_CONTEXT CONTEXT = PCB.location()

ParseContext::ParseContext(dxi_pcb_struct &pcb)
  : FileLocation(pcb.pointer, pcb.line, pcb.column),
    mode(pcb.mode)
{ /* empty */ }

// constructor for parser control block
dxi_pcb_struct::dxi_pcb_struct(Dataset &d)
  : dataset(d),
    mode(executeMode),
    loopActive(0),
    returnValue()
{ /* empty */ }

void dxi_pcb_struct::parseSyntax
    (const char *selector, const FileLocation &s) {
  pointer = (const unsigned char *) selector;
  startLocation = s;
  try {
    dxi(this);
  }
  catch (ErrorMessage e) {
    reportError(e.message());
  }
}

void dxi_pcb_type::setStart() {
  setLocation(startLocation);
}

void dxi_pcb_struct::simpleLoop(const char *selector) {
  ParseContext loopLocation(*this);
  dxi_pcb_struct loopPCB(dataset);
  loopPCB.loopActive++;          // Mark the parser as being in an active loop
  loopPCB.mode = mode == executeMode ? executeMode : breakMode;    // Set mode
  for (;;) {
    loopPCB.parseSyntax(selector, loopLocation);
    setLocation(ParseContext(loopPCB));          //Transfer location to parent
    if (loopPCB.mode == breakMode) return;
    loopPCB.mode = executeMode;    // mode could have been set to continueMode
  }
}

void dxi_pcb_struct::forLoop
    (const FileLocation &condLoc, const FileLocation &incLoc)
{
  restoreMode();       // mode was set to scanMode to pick up loop header info
  ParseContext statementLocation(*this);         // Capture statement location
  dxi_pcb_struct loopPCB(dataset);
  loopPCB.loopActive++;          // Mark the parser as being in an active loop
  loopPCB.mode = mode == executeMode ? executeMode : breakMode;    // Set mode
  for (;;) {
    if (loopPCB.mode == executeMode) {
      loopPCB.parseSyntax("forField", condLoc);    // Evaluate condition field
      Value result = dxi_value(&loopPCB);
      if (result.isDefined() && result.isFalse()) loopPCB.mode = breakMode;
    }
    loopPCB.parseSyntax("statement", statementLocation);
    setLocation(ParseContext(loopPCB));       // Set location in parent parser
    if (loopPCB.mode == breakMode) return;
    loopPCB.mode = executeMode;    // Mode could have been set to continueMode
    loopPCB.parseSyntax("forField", incLoc);
  }
}

ParseContext dxi_pcb_struct::location() {
  return ParseContext(*this);
}

// Set parse location in source text
void dxi_pcb_struct::setLocation(const FileLocation &l) {
	pointer = l.pointer;
	line = l.line;
	column = l.column;
}

// Set return value
void dxi_pcb_struct::setReturnValue(const Value &v) {
  if (mode != executeMode) return;   // exit setReturnValue
  returnValue = v;
  exit_flag = AG_SUCCESS_CODE;  // Exit parser
}

// if mode == currentMode change mode to desiredMode and return true.
// Otherwise, leave mode unchanged and return false.
int dxi_pcb_struct::changeMode(Mode currentMode, Mode desiredMode) {
  if (mode != currentMode) return 0;
  mode = desiredMode;
  return 1;
}

void dxi_pcb_struct::interruptLoop(Mode desiredMode) {
  if (mode != executeMode) return;
  if (loopActive == 0) reportError("No loop active");
  mode = desiredMode;
}

// if mode == currentMode, restore the mode in effect at the beginning of the
// rule. Otherwise, leave the mode unchanged.
void dxi_pcb_struct::restoreMode(Mode currentMode) {
  if (mode == currentMode) mode = PCONTEXT(*this).mode;
}

// Unconditionally restore the mode in effect at the beginning of the rule.
void dxi_pcb_struct::restoreMode() {
  mode = PCONTEXT(*this).mode;
}

// dump variable name and value
void dxi_pcb_struct::dump(const AgString &n) const {
  if (mode != executeMode) return;
  cout << (const char *) n
       << " = "
       << (const char *) dataset.value(n).asLiteral()
       << "\n";
}

// print value
void dxi_pcb_struct::print(const Value &value) const {
  if (mode != executeMode) return;
  cout << (const char *) value.asString();
}

Value dxi_pcb_struct::powm(Value &lvalue, const Value &exp) const {
  if (mode != executeMode) return Value();
  Value base = lvalue;
  lvalue = pow(base.deref(), exp);
  return lvalue.deref();
}

// Record syntax error
void dxi_pcb_struct::reportError() {
  ag_delete_wrappers(this);
  char buf[100];
  sprintf(buf, "Error(%d,%d): %s", line, column, error_message);
  throw ErrorDiagnostic(buf);
}

void dxi_pcb_struct::reportError(const char *msg) {
  ag_delete_wrappers(this);
  char buf[100];
  ParseContext &context = PCONTEXT(*this);
  sprintf(buf, "Error(%d,%d): %s", context.line, context.column, msg);
  throw ErrorDiagnostic(buf);
}

Value interpret(const char *text, Dataset &d) {
  dxi_pcb_struct pcb(d);
  pcb.parseSyntax("script", FileLocation((const unsigned char *)text));
  int i;
  for (i = pcb.localList.size(); i--;) {
    d.value(pcb.localList[i]) = pcb.saveStack.pop();
  }
  return pcb.returnValue;
}

Value dxi_pcb_struct::callFunction(
  const AgString &name,
  AgStack<Value> &args)
{
  if (mode != executeMode) return Value();
  int nArgs = args.size();
  // Is there a variable with this name?
  int index = dataset.dictionary.lookup(name);
  if (index >= 0 && dataset[index].isFunction()) {
    LocalFunction &f = dataset[index].getFunction();
    if (nArgs == f.parameterList.size()) {
      int i;
      dxi_pcb_struct callPCB(dataset);
      // Save existing values for parameter variables
      for (i = 0; i < nArgs; i++) {
        Value &value = dataset.value(f.parameterList[i]);
        saveStack.push(value);
        value = args[i];                    // set variable to parameter value
      }

      const char *text = (const char *) f.text;
      callPCB.parseSyntax("script", FileLocation((const unsigned char *) text));

      // Restore local variables
      for (i = callPCB.localList.size(); i--;) {
        dataset.value(callPCB.localList[i]) = callPCB.saveStack.pop();
      }
      // Restore original values for parameter variables
      for (i = nArgs; i--;) {
        dataset.value(f.parameterList[i]) = saveStack.pop();
      }
      return callPCB.returnValue;
    }
  }
  // Not a locally defined function, try a library function
  return ::callFunction(idFunction(name, args.size()), args);
}


void dxi_pcb_struct::defineFunction(
    const AgString &n,
    const AgStack<AgString> &nameList,
    const AgString &text)
{
  mode = PCONTEXT(*this).mode;
  if (mode != executeMode) return;
  LocalFunction f(nameList, text);
  dataset.value(n) = Value(f);
}

void dxi_pcb_struct::localVariables(const AgStack<AgString> &list) {
  if (mode != executeMode) return;
  localList = list;
  int i;
  for (i = 0; i < list.size(); i++) {
    saveStack.push(dataset.value(list[i]));
  }
}


#ifndef CONVERT_CASE
#define CONVERT_CASE(c) (c)
#endif
#ifndef TAB_SPACING
#define TAB_SPACING 8
#endif
Value dxi_value(PCB_DECL) {
  Value returnValue;
  returnValue = (*(AgObjectWrapper< Value > *) &(PCB).vs[(PCB).ssx]);
  return returnValue;
}

static inline Value ag_rp_1(PCB_DECL) {
/* Line 195, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return Value();
}

static inline Value ag_rp_5(PCB_DECL, Value &x) {
/* Line 199, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return x;
}

static inline void ag_rp_6(PCB_DECL) {
/* Line 203, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.setStart();
}

static inline void ag_rp_7(PCB_DECL) {
/* Line 206, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.setStart();
}

static inline void ag_rp_8(PCB_DECL) {
/* Line 209, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.setStart();
}

static inline void ag_rp_9(PCB_DECL) {
/* Line 212, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.setStart();
}

static inline void ag_rp_10(PCB_DECL) {
/* Line 215, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.setStart();
}

static inline void ag_rp_11(PCB_DECL) {
/* Line 238, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.restoreMode(elseMode);
}

static inline void ag_rp_12(PCB_DECL) {
/* Line 240, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.restoreMode(blockMode);
}

static inline void ag_rp_13(PCB_DECL) {
/* Line 244, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.restoreMode(blockMode);
}

static inline void ag_rp_14(PCB_DECL) {
/* Line 258, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.simpleLoop("doLoop");
}

static inline void ag_rp_15(PCB_DECL) {
/* Line 259, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.simpleLoop("whileLoop");
}

static inline void ag_rp_16(PCB_DECL, FileLocation c, FileLocation i) {
/* Line 260, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.forLoop(c, i);
}

static inline void ag_rp_17(PCB_DECL) {
/* Line 264, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.interruptLoop(breakMode);
}

static inline void ag_rp_18(PCB_DECL) {
/* Line 265, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.interruptLoop(continueMode);
}

static inline void ag_rp_19(PCB_DECL, Value &x) {
/* Line 266, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.setReturnValue(x);
}

static inline void ag_rp_20(PCB_DECL) {
/* Line 281, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.changeMode(continueMode, executeMode);
}

static inline void ag_rp_21(PCB_DECL, AgStack<AgString> &list) {
/* Line 285, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.localVariables(list);
}

static void ag_rp_22(PCB_DECL, Value &x) {
/* Line 290, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
if (PCB.mode != executeMode || x.isFalse()) PCB.mode = breakMode;
}

static inline void ag_rp_23(PCB_DECL) {
/* Line 293, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.mode = scanMode;
}

static inline FileLocation ag_rp_24(PCB_DECL) {
/* Line 296, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return CONTEXT;
}

static void ag_rp_25(PCB_DECL, Value &x) {
/* Line 301, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
if (PCB.mode == executeMode && x.isFalse()) PCB.mode = elseMode;
}

static inline void ag_rp_26(PCB_DECL) {
/* Line 305, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.changeMode(executeMode, blockMode),PCB.changeMode(elseMode, executeMode);
}

static inline void ag_rp_27(PCB_DECL, AgString &n) {
/* Line 312, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.dump(n);
}

static inline void ag_rp_28(PCB_DECL, AgString &n) {
/* Line 313, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.dump(n);
}

static inline void ag_rp_29(PCB_DECL, Value &x) {
/* Line 317, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.print(x);
}

static inline void ag_rp_30(PCB_DECL, Value &x) {
/* Line 318, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.print(x);
}

static inline void ag_rp_31(PCB_DECL, AgString &n, AgStack<AgString> &list) {
/* Line 321, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.mode = scanMode;
}

static inline void ag_rp_32(PCB_DECL, AgString &n, AgStack<AgString> &list, AgString &text) {
/* Line 322, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  PCB.defineFunction(n, list, text);
}

static AgString ag_rp_33(PCB_DECL) {
/* Line 325, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
return AgString().append(
               (const char *) CONTEXT.pointer, PCB.pointer - CONTEXT.pointer);
 
}

static inline AgStack<AgString> ag_rp_34(PCB_DECL, AgString &n) {
/* Line 330, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return AgStack<AgString>().push(n);
}

static inline AgStack<AgString> ag_rp_35(PCB_DECL, AgStack<AgString> &stack, AgString &n) {
/* Line 331, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return stack.push(n);
}

static inline Value ag_rp_36(PCB_DECL) {
/* Line 334, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return Value();
}

static inline Value ag_rp_37(PCB_DECL, Value &x) {
/* Line 340, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return x;
}

static inline Value ag_rp_38(PCB_DECL, Value &lv, Value &x) {
/* Line 344, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(lv = x);
}

static inline Value ag_rp_39(PCB_DECL, Value &lv, Value &x) {
/* Line 345, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(lv += x);
}

static inline Value ag_rp_40(PCB_DECL, Value &lv, Value &x) {
/* Line 346, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(lv -= x);
}

static inline Value ag_rp_41(PCB_DECL, Value &lv, Value &x) {
/* Line 347, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(lv *= x);
}

static inline Value ag_rp_42(PCB_DECL, Value &lv, Value &x) {
/* Line 348, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(lv /= x);
}

static inline Value ag_rp_43(PCB_DECL, Value &lv, Value &x) {
/* Line 349, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(lv %= x);
}

static inline Value ag_rp_44(PCB_DECL, Value &lv, Value &x) {
/* Line 350, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(lv |= x);
}

static inline Value ag_rp_45(PCB_DECL, Value &lv, Value &x) {
/* Line 351, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(lv ^= x);
}

static inline Value ag_rp_46(PCB_DECL, Value &lv, Value &x) {
/* Line 352, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(lv &= x);
}

static inline Value ag_rp_47(PCB_DECL, Value &lv, Value &x) {
/* Line 353, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(lv <<= x);
}

static inline Value ag_rp_48(PCB_DECL, Value &lv, Value &x) {
/* Line 354, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(lv >>= x);
}

static inline Value ag_rp_49(PCB_DECL, Value &lv, Value &x) {
/* Line 355, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return PCB.powm(lv,x);
}

static void ag_rp_50(PCB_DECL, Value &c) {
/* Line 361, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
if (PCB.mode == executeMode && c.isFalse())  PCB.mode = elseMode;
}

static void ag_rp_51(PCB_DECL, Value &c, Value &x) {
/* Line 363, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
if (!PCB.changeMode(elseMode, executeMode))
         PCB.changeMode(executeMode, blockMode);
}

static inline Value ag_rp_52(PCB_DECL, Value &c, Value &x, Value &y) {
/* Line 366, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return PCB.mode = CONTEXT.mode, VALUE(c.isTrue() ? x : y);
}

static void ag_rp_53(PCB_DECL, Value &x) {
/* Line 372, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
if (PCB.mode == executeMode && x.isTrue()) PCB.mode = blockMode;
}

static inline Value ag_rp_54(PCB_DECL, Value &x, Value &y) {
/* Line 373, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return PCB.restoreMode(), VALUE(x.isTrue() ? x : y);
}

static void ag_rp_55(PCB_DECL, Value &x) {
/* Line 378, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
if (PCB.mode == executeMode && x.isFalse()) PCB.mode = blockMode;
}

static inline Value ag_rp_56(PCB_DECL, Value &x, Value &y) {
/* Line 379, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return PCB.restoreMode(), VALUE(x.isTrue() ? y : x);
}

static inline Value ag_rp_57(PCB_DECL, Value &x, Value &y) {
/* Line 384, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(x |= y);
}

static inline Value ag_rp_58(PCB_DECL, Value &x, Value &y) {
/* Line 388, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(x ^= y);
}

static inline Value ag_rp_59(PCB_DECL, Value &x, Value &y) {
/* Line 392, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(x &= y);
}

static inline Value ag_rp_60(PCB_DECL, Value &x, Value &y) {
/* Line 396, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(x == y);
}

static inline Value ag_rp_61(PCB_DECL, Value &x, Value &y) {
/* Line 397, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(x != y);
}

static inline Value ag_rp_62(PCB_DECL, Value &x, Value &y) {
/* Line 401, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(x < y);
}

static inline Value ag_rp_63(PCB_DECL, Value &x, Value &y) {
/* Line 402, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(x <= y);
}

static inline Value ag_rp_64(PCB_DECL, Value &x, Value &y) {
/* Line 403, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(x > y);
}

static inline Value ag_rp_65(PCB_DECL, Value &x, Value &y) {
/* Line 404, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(x >= y);
}

static inline Value ag_rp_66(PCB_DECL, Value &x, Value &y) {
/* Line 408, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(x <<= y);
}

static inline Value ag_rp_67(PCB_DECL, Value &x, Value &y) {
/* Line 409, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(x >>= y);
}

static inline Value ag_rp_68(PCB_DECL, Value &x, Value &y) {
/* Line 413, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(x += y);
}

static inline Value ag_rp_69(PCB_DECL, Value &x, Value &y) {
/* Line 414, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(x -= y);
}

static inline Value ag_rp_70(PCB_DECL, Value &x, Value &y) {
/* Line 418, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(x *= y);
}

static inline Value ag_rp_71(PCB_DECL, Value &x, Value &y) {
/* Line 419, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(x /= y);
}

static inline Value ag_rp_72(PCB_DECL, Value &x, Value &y) {
/* Line 420, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(x %= y);
}

static inline Value ag_rp_73(PCB_DECL, Value &x) {
/* Line 424, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(x);
}

static inline Value ag_rp_74(PCB_DECL, Value &x) {
/* Line 425, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(-x);
}

static inline Value ag_rp_75(PCB_DECL, Value &x) {
/* Line 426, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(!x);
}

static inline Value ag_rp_76(PCB_DECL, Value &x) {
/* Line 427, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(~x);
}

static inline Value ag_rp_77(PCB_DECL, Value &x, Value &y) {
/* Line 435, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(pow(x, y));
}

static inline Value ag_rp_78(PCB_DECL, Value &x) {
/* Line 443, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return x;
}

static inline Value ag_rp_79(PCB_DECL, Value &lv) {
/* Line 445, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(lv.deref());
}

static inline Value ag_rp_80(PCB_DECL, Value &lv) {
/* Line 446, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(++lv);
}

static inline Value ag_rp_81(PCB_DECL, Value &lv) {
/* Line 447, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(--lv);
}

static inline Value ag_rp_82(PCB_DECL, Value &lv) {
/* Line 448, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(lv++);
}

static inline Value ag_rp_83(PCB_DECL, Value &lv) {
/* Line 449, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(lv--);
}

static inline Value ag_rp_84(PCB_DECL, Value &x) {
/* Line 451, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(x.makeInteger());
}

static inline Value ag_rp_85(PCB_DECL, Value &x) {
/* Line 452, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(x.makeReal());
}

static inline Value ag_rp_86(PCB_DECL, AgString &n) {
/* Line 455, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(&PCB.dataset.value(n));
}

static inline Value ag_rp_87(PCB_DECL, AgString &n, AgStack<Value> &args) {
/* Line 458, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return PCB.callFunction(n, args);
}

static inline AgStack<Value> ag_rp_88(PCB_DECL) {
/* Line 461, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return AgStack<Value>();
}

static inline AgStack<Value> ag_rp_89(PCB_DECL, Value &x) {
/* Line 465, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return AgStack<Value>().push(x);
}

static inline AgStack<Value> ag_rp_90(PCB_DECL, AgStack<Value> &stack, Value &x) {
/* Line 466, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return stack.push(x);
}

static inline Value ag_rp_91(PCB_DECL, long x) {
/* Line 469, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(x);
}

static inline Value ag_rp_92(PCB_DECL, double x) {
/* Line 470, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(x);
}

static inline Value ag_rp_93(PCB_DECL, int x) {
/* Line 472, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(x);
}

static inline AgString ag_rp_94(PCB_DECL, int c) {
/* Line 490, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return AgString().append(c);
}

static inline AgString ag_rp_95(PCB_DECL, AgString &ns, int c) {
/* Line 491, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return ns.append(c);
}

static inline double ag_rp_96(PCB_DECL, double x, long e) {
/* Line 496, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return x*pow(10,e);
}

static inline double ag_rp_97(PCB_DECL, double x, long e) {
/* Line 497, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return x*pow(10,e);
}

static inline double ag_rp_98(PCB_DECL, double i, double f) {
/* Line 500, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return i+f;
}

static inline double ag_rp_99(PCB_DECL, double i) {
/* Line 501, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return i;
}

static inline double ag_rp_100(PCB_DECL, double f) {
/* Line 502, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return f;
}

static inline double ag_rp_101(PCB_DECL, long x) {
/* Line 505, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return x;
}

static inline double ag_rp_102(PCB_DECL, long x) {
/* Line 506, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return x;
}

static inline double ag_rp_103(PCB_DECL, long x) {
/* Line 507, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return makeDecimal(x);
}

static inline long ag_rp_104(PCB_DECL, long x) {
/* Line 510, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return (long)x;
}

static inline long ag_rp_105(PCB_DECL, long x) {
/* Line 511, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return -(long)x;
}

static inline double ag_rp_106(PCB_DECL, int d) {
/* Line 514, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return (d-'0')/10.0;
}

static inline double ag_rp_107(PCB_DECL, int d, double f) {
/* Line 515, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return (d-'0' + f)/10.0;
}

static inline long ag_rp_108(PCB_DECL, int d) {
/* Line 523, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return d-'0';
}

static inline long ag_rp_109(PCB_DECL, long x, int d) {
/* Line 524, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return 10*x + d-'0';
}

static inline long ag_rp_110(PCB_DECL, int d) {
/* Line 527, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return d-'0';
}

static inline long ag_rp_111(PCB_DECL, long x, int d) {
/* Line 528, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return 10*x + d-'0';
}

static inline long ag_rp_112(PCB_DECL, long x, int d) {
/* Line 531, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return 10*makeDecimal(x) + d - '0';
}

static inline long ag_rp_113(PCB_DECL, long x, int d) {
/* Line 532, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return 10*x + d-'0';
}

static inline long ag_rp_114(PCB_DECL) {
/* Line 535, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return 0;
}

static inline long ag_rp_115(PCB_DECL, long n, int d) {
/* Line 536, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return 8*n + d - '0';
}

static inline long ag_rp_116(PCB_DECL) {
/* Line 539, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return 0;
}

static inline long ag_rp_117(PCB_DECL, long n, int d) {
/* Line 540, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return 16*n + d;
}

static inline int ag_rp_118(PCB_DECL, int x) {
/* Line 543, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return x - '0';
}

static inline int ag_rp_119(PCB_DECL, int d) {
/* Line 544, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return (d & 7) + 9;
}

static inline Value ag_rp_120(PCB_DECL, Value &s, Value &e) {
/* Line 550, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(s+=e);
}

static inline Value ag_rp_121(PCB_DECL, AgString &b) {
/* Line 553, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return VALUE(b);
}

static inline AgString ag_rp_122(PCB_DECL) {
/* Line 556, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return AgString();
}

static inline AgString ag_rp_123(PCB_DECL, AgString &s, int c) {
/* Line 557, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return s.append(c);
}

static inline int ag_rp_124(PCB_DECL) {
/* Line 569, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return '\'';
}

static inline int ag_rp_125(PCB_DECL) {
/* Line 570, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return '"';
}

static inline int ag_rp_126(PCB_DECL) {
/* Line 571, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return '\?';
}

static inline int ag_rp_127(PCB_DECL) {
/* Line 572, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return '\\';
}

static inline int ag_rp_128(PCB_DECL) {
/* Line 573, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return '\a';
}

static inline int ag_rp_129(PCB_DECL) {
/* Line 574, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return '\b';
}

static inline int ag_rp_130(PCB_DECL) {
/* Line 575, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return '\f';
}

static inline int ag_rp_131(PCB_DECL) {
/* Line 576, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return '\n';
}

static inline int ag_rp_132(PCB_DECL) {
/* Line 577, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return '\r';
}

static inline int ag_rp_133(PCB_DECL) {
/* Line 578, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return '\t';
}

static inline int ag_rp_134(PCB_DECL) {
/* Line 579, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return '\v';
}

static inline int ag_rp_135(PCB_DECL, int d) {
/* Line 585, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return d-'0';
}

static inline int ag_rp_136(PCB_DECL, int n, int d) {
/* Line 588, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return 8*n + d-'0';
}

static inline int ag_rp_137(PCB_DECL, int n, int d) {
/* Line 591, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return 8*n + d-'0';
}

static inline int ag_rp_138(PCB_DECL, int d) {
/* Line 594, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return d;
}

static inline int ag_rp_139(PCB_DECL, int n, int d) {
/* Line 595, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return 16*n + d;
}

static inline int ag_rp_140(PCB_DECL, int d) {
/* Line 598, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return d-'0';
}

static inline int ag_rp_141(PCB_DECL, int d) {
/* Line 599, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return 9 + (d & 7);
}

static inline int ag_rp_142(PCB_DECL, int c) {
/* Line 608, W:/agdev/agex/packages/xidek/cll/function/dxi.syn */
  return c;
}


#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 const char ag_wdf[] = {
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0,
  5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 4, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5, 5, 0,
  0, 0, 0, 5, 7, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  0, 6, 6, 0, 0, 0, 0, 5, 0, 5, 0, 0, 0, 0, 0, 5, 0, 5, 5, 7, 0, 0, 0,
  0, 0, 0, 0, 0, 4, 0
};

#undef  VW
#define VW(i,t) *(t) (&(PCB).vs[(PCB).ssx + (i)])
#undef  VNO
#define VNO new(&(PCB).vs[(PCB).ssx])
#undef  VRO
#define VRO(to,v) ag_replace_object((to) &(PCB).vs[(PCB).ssx], v)
#undef  VWD
#define VWD(i,t) ag_delete_object((t) &(PCB).vs[(PCB).ssx + (i)]);
#undef  VDO
#define VDO(to, v) ag_delete_object((to) &(PCB).vs[(PCB).ssx], v)

template <class NewObject, class OldObject>
static inline void ag_replace_object(AgObjectWrapper<OldObject> *p, const NewObject &o) {
  delete p;
  new(p) AgObjectWrapper<NewObject >(o);
}

template <class Object>
static inline void ag_delete_object(AgObjectWrapper<Object> *p) {
  delete p;
}

template <class NewObject, class OldObject>
static inline const NewObject &ag_delete_object(AgObjectWrapper<OldObject> *p, const NewObject &o) {
  delete p;
  return o;
}


#undef AG_WRAP_4
#define AG_WRAP_4 AgObjectWrapper<AgString >
#undef AG_WRAP_5
#define AG_WRAP_5 AgObjectWrapper<Value >
#undef AG_WRAP_6
#define AG_WRAP_6 AgObjectWrapper<AgStack<Value> >
#undef AG_WRAP_7
#define AG_WRAP_7 AgObjectWrapper<AgStack<AgString> >

static void ag_delete_wrappers(PCB_DECL) {
  int sn = (PCB).sn;
  int sx = (PCB).ssx;
  while (sx--) {
    switch (ag_wdf[sn]) {
      case 4: ag_delete_object((AG_WRAP_4 *) &(PCB).vs[sx]); break;
      case 5: ag_delete_object((AG_WRAP_5 *) &(PCB).vs[sx]); break;
      case 6: ag_delete_object((AG_WRAP_6 *) &(PCB).vs[sx]); break;
      case 7: ag_delete_object((AG_WRAP_7 *) &(PCB).vs[sx]); break;
      default: break;
    }
    sn = (PCB).ss[sx];
  }
}

static dxi_vs_type const ag_null_value NULL_VALUE_INITIALIZER;

static const unsigned char ag_rpx[] = {
    0,  1,  1,  1,  1,  2,  3,  4,  5,  6,  7,  0,  0,  0,  0,  8,  9, 10,
    0, 11, 12, 13, 14,  0,  0, 15, 16, 17,  0,  0,  0,  0,  0,  0, 18,  0,
   19, 20, 21,  0, 14, 22, 23, 24,  0, 25, 26, 27, 28, 29, 30, 31, 32, 33,
   34,  0,  0, 35,  0, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,  0,
   48, 49, 50,  0, 51, 52,  0, 53, 54,  0, 55,  0, 56,  0, 57,  0, 58, 59,
    0, 60, 61, 62, 63,  0, 64, 65,  0, 66, 67,  0, 68, 69, 70,  0, 71, 72,
   73, 74,  0, 75, 76,  0, 77, 78, 79, 80, 81,  0, 82, 83, 84, 85, 86,  0,
   87, 88, 89, 90,  0, 91,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 92,
   93,  0, 94, 95, 96, 97, 98, 99,100,101,  0,  0,102,103,104,105,  0,  0,
    0,106,107,108,109,110,111,112,113,  0,  0,114,115,116,117,  0,118,119,
  120,121,  0,  0,  0,  0,  0,122,123,124,125,126,127,128,129,130,131,132,
    0,  0,  0,133,134,135,136,137,138,139,140
};

static const unsigned char ag_key_itt[] = {
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 0
};

static const unsigned short ag_key_pt[] = {
  0, 21,  0, 22,  0, 23,  0, 24,  0, 25,  0,205,  0,206,  0,207,
  0,208,  0,209,  0,210,  0,211,  0,213,  0,214,  0,218,  0,220,
  0,221,  0,259,  0,260,0
};

static const unsigned char ag_key_ch[] = {
    0, 42, 47,255, 99,116,255, 47,100,102,115,119,255, 42,255, 38, 61,255,
   61,255, 42, 61,255, 43, 61,255, 45, 61,255, 42, 47, 61,255, 88,120,255,
   61,255, 60, 61,255, 61,255, 61, 62,255, 76,117,255,111,117,255, 70,255,
  114,255,111,117,255, 99,110,255,111,255, 99,116,255, 76,255,101,255,108,
  255,105,255,104,255, 61,124,255, 33, 37, 38, 42, 43, 45, 47, 48, 60, 61,
   62, 94, 98, 99,100,101,102,105,108,112,114,115,119,124,255, 99,116,255,
  100,102,115,119,255, 42, 47,255, 88,120,255, 43, 45, 47, 48,255, 42, 47,
  255, 88,120,255,111,117,255,111,117,255, 43, 45, 47, 48, 98, 99,100,102,
  105,112,114,119,255, 42, 47,255, 47,255, 42, 47,255, 88,120,255,111,117,
  255,111,117,255, 43, 45, 47, 48, 98, 99,100,102,105,108,112,114,119,255,
   88,120,255, 43, 45, 48,255, 88,120,255,111,117,255,111,117,255, 43, 45,
   48, 98, 99,100,102,105,112,114,119,255, 88,120,255,111,117,255,111,117,
  255, 43, 45, 48, 98, 99,100,102,105,108,112,114,119,255, 34, 39, 63, 92,
   97, 98,102,110,114,116,118,120,255, 92,255, 42, 47,255, 60, 61,255, 61,
   62,255, 33, 38, 42, 47, 60, 61, 62,124,255, 60, 61,255, 61, 62,255, 33,
   38, 42, 60, 61, 62,124,255, 42, 47,255, 88,120,255, 43, 45, 47, 48,100,
  108,255, 88,120,255, 43, 45, 48,100,108,255, 60, 61,255, 61, 62,255, 33,
   38, 60, 61, 62,124,255, 33, 38, 60, 61, 62,124,255, 33, 38, 61,124,255,
   38,124,255, 38, 61,255, 61,255, 42, 61,255, 43, 61,255, 45, 61,255, 42,
   47, 61,255, 61,255, 60, 61,255, 61,255, 61, 62,255, 61,124,255, 33, 37,
   38, 42, 43, 45, 47, 60, 61, 62, 94,124,255, 38, 61,255, 61,255, 42, 61,
  255, 43, 61,255, 45, 61,255, 61,255, 60, 61,255, 61,255, 61, 62,255, 61,
  124,255, 33, 37, 38, 42, 43, 45, 47, 60, 61, 62, 94,124,255,124,255, 42,
   47,255, 88,120,255,111,117,255,111,117,255, 43, 45, 47, 48, 98, 99,100,
  101,102,105,112,114,119,255,119,255, 60, 61,255, 61, 62,255, 33, 38, 42,
   43, 45, 60, 61, 62,124,255, 42, 47,255, 88,120,255, 60, 61,255, 61, 62,
  255,111,117,255,111,117,255, 33, 38, 42, 43, 45, 47, 48, 60, 61, 62, 98,
   99,100,101,102,105,112,114,119,124,255, 88,120,255,111,117,255,111,117,
  255, 43, 45, 48, 98, 99,100,101,102,105,112,114,119,255
};

static const unsigned char ag_key_act[] = {
  0,0,0,4,7,7,4,2,7,7,2,7,4,3,4,0,0,4,0,4,1,0,4,0,0,4,0,0,4,0,0,0,4,0,0,
  4,0,4,1,0,4,0,4,0,1,4,7,7,4,6,7,4,7,4,6,4,2,7,4,7,7,4,2,4,7,7,4,7,4,6,
  4,2,4,2,4,2,4,0,0,4,3,3,2,2,2,2,2,2,2,3,2,3,7,7,2,7,2,7,2,7,7,2,2,2,4,
  7,7,4,7,7,2,7,4,0,0,4,0,0,4,3,3,2,2,4,0,0,4,0,0,4,5,7,4,7,7,4,3,3,2,2,
  7,7,2,2,7,7,7,7,4,0,0,4,2,4,0,0,4,0,0,4,5,7,4,7,7,4,3,3,2,2,7,7,2,2,7,
  7,7,7,7,4,0,0,4,3,3,2,4,0,0,4,5,7,4,7,7,4,3,3,2,7,7,2,2,7,7,7,7,4,0,0,
  4,5,7,4,7,7,4,3,3,2,7,7,2,2,7,7,7,7,7,4,0,0,0,0,0,0,0,0,0,0,0,0,4,2,4,
  0,0,4,0,0,4,0,0,4,3,3,3,2,2,3,2,3,4,0,0,4,0,0,4,3,3,3,2,3,2,3,4,0,0,4,
  0,0,4,3,3,2,2,7,7,4,0,0,4,3,3,2,7,7,4,0,0,4,0,0,4,3,3,2,3,2,3,4,3,3,3,
  3,3,3,4,3,3,3,3,4,3,3,4,0,0,4,0,4,1,0,4,0,0,4,0,0,4,0,0,0,4,0,4,1,0,4,
  0,4,0,1,4,0,0,4,3,3,2,2,2,2,2,2,3,2,3,2,4,0,0,4,0,4,1,0,4,0,0,4,0,0,4,
  0,4,1,0,4,0,4,0,1,4,0,0,4,3,3,2,2,2,2,3,2,3,2,3,2,4,3,4,0,0,4,0,0,4,5,
  7,4,7,7,4,3,3,2,2,7,7,2,7,2,7,7,7,7,4,7,4,0,0,4,0,0,4,3,3,3,3,3,2,3,2,
  3,4,0,0,4,0,0,4,0,0,4,0,0,4,5,7,4,7,7,4,3,3,3,3,3,2,2,2,3,2,7,7,2,7,2,
  7,7,7,7,3,4,0,0,4,5,7,4,7,7,4,3,3,2,7,7,2,7,2,7,7,7,7,4
};

static const unsigned short ag_key_parm[] = {
    0,128,133,  0,  0,  6,  0,  0,  4,  8,  0,  2,  0,132,  0,237,230,  0,
  233,  0,256,225,  0,257,223,  0,258,224,  0,128,133,226,  0,159,158,  0,
  231,  0,247,244,  0,232,  0,246,248,  0,  4, 36,  0, 16, 28,  0,  8,  0,
   20,  0,  0, 32,  0, 22, 34,  0,  0,  0,  0,  6,  0,  2,  0, 18,  0,  0,
    0,  0,  0,  0,  0,228,236,  0,242,227,  0,  0,  0,  0,  0,  0,  0,241,
    0,229, 10, 12,  0, 26,  0, 24,  0, 30, 14,  0,  0,  0,  0,  0,  6,  0,
    4,  8,  0,  2,  0,128,133,  0,159,158,  0,257,258,  0,  0,  0,128,133,
    0,159,158,  0, 16, 28,  0, 20, 32,  0,257,258,  0,  0, 10, 12,  0,  0,
   24, 30, 14, 18,  0,128,133,  0,  0,  0,128,133,  0,159,158,  0, 16, 28,
    0, 20, 32,  0,257,258,  0,  0, 10, 12,  0,  0, 24, 22, 30, 14, 18,  0,
  159,158,  0,257,258,  0,  0,159,158,  0, 16, 28,  0, 20, 32,  0,257,258,
    0, 10, 12,  0,  0, 24, 30, 14, 18,  0,159,158,  0, 16, 28,  0, 20, 32,
    0,257,258,  0, 10, 12,  0,  0, 24, 22, 30, 14, 18,  0,172,171,173,174,
  175,176,177,178,179,180,181,186,  0,  0,  0,128,133,  0,247,244,  0,246,
  248,  0,242,237,256,  0,  0,241,  0,236,  0,247,244,  0,246,248,  0,242,
  237,256,  0,241,  0,236,  0,128,133,  0,159,158,  0,257,258,  0,  0, 36,
   34,  0,159,158,  0,257,258,  0, 36, 34,  0,247,244,  0,246,248,  0,242,
  237,  0,241,  0,236,  0,242,237,244,241,246,236,  0,242,237,241,236,  0,
  237,236,  0,237,230,  0,233,  0,256,225,  0,257,223,  0,258,224,  0,128,
  133,226,  0,231,  0,247,244,  0,232,  0,246,248,  0,228,236,  0,242,227,
    0,  0,  0,  0,  0,  0,241,  0,229,  0,  0,237,230,  0,233,  0,256,225,
    0,257,223,  0,258,224,  0,231,  0,247,244,  0,232,  0,246,248,  0,228,
  236,  0,242,227,  0,  0,  0,  0,226,  0,241,  0,229,  0,  0,236,  0,128,
  133,  0,159,158,  0, 16, 28,  0, 20, 32,  0,257,258,  0,  0, 10, 12,  0,
   26,  0, 24, 30, 14, 18,  0, 18,  0,247,244,  0,246,248,  0,242,237,256,
  257,258,  0,241,  0,236,  0,128,133,  0,159,158,  0,247,244,  0,246,248,
    0, 16, 28,  0, 20, 32,  0,242,237,256,257,258,  0,  0,  0,241,  0, 10,
   12,  0, 26,  0, 24, 30, 14, 18,236,  0,159,158,  0, 16, 28,  0, 20, 32,
    0,257,258,  0, 10, 12,  0, 26,  0, 24, 30, 14, 18,  0
};

static const unsigned short ag_key_jmp[] = {
    0,  0,  0,  0, 14, 19,  0,  1,  0,  6,  4, 27,  0, 36,  0,  0,  0,  0,
    0,  0, 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0, 36,  0,  0,  0,  0,  0, 41,  0, 59, 63,  0, 46, 67,  0, 74,  0,
   52,  0, 54, 79,  0, 88, 91,  0, 59,  0,104,109,  0,117,  0, 67,  0, 69,
    0, 71,  0, 73,  0,  0,  0,  0, 38, 40, 15, 20, 23, 26, 29, 33, 38, 42,
   43, 44, 46, 51, 49, 70, 56, 86, 62, 93, 98, 64, 75, 77,  0,135,140,  0,
  121,127,105,148,  0,  0,  0,  0,  0,  0,  0,157,159,113,116,  0,  0,  0,
    0,  0,  0,  0,  0,178,  0,181,183,  0,161,163,124,127,165,170,130,133,
  190,192,197,203,  0,  0,  0,  0,149,  0,  0,  0,  0,  0,  0,  0,  0,225,
    0,228,230,  0,208,210,154,157,212,217,160,163,237,239,244,249,255,  0,
    0,  0,  0,260,262,180,  0,  0,  0,  0,  0,281,  0,284,286,  0,264,266,
  187,268,273,190,193,293,295,300,306,  0,  0,  0,  0,  0,328,  0,331,333,
    0,311,313,208,315,320,211,214,340,342,347,352,358,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,230,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,363,365,367,245,248,369,251,371,  0,  0,  0,  0,  0,  0,  0,373,
  375,377,263,379,266,381,  0,  0,  0,  0,  0,  0,  0,383,385,277,280,387,
  393,  0,  0,  0,  0,397,399,290,401,407,  0,  0,  0,  0,  0,  0,  0,411,
  413,299,415,302,417,  0,419,421,423,425,427,429,  0,431,433,435,437,  0,
  439,441,  0,  0,  0,  0,  0,  0,330,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,345,  0,  0,  0,  0,  0,350,  0,  0,  0,  0,443,445,
  327,332,335,338,341,347,447,352,449,355,  0,  0,  0,  0,  0,  0,374,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,385,  0,  0,  0,  0,  0,390,  0,  0,
    0,  0,451,453,371,376,379,382,455,387,457,392,459,395,  0,461,  0,  0,
    0,  0,  0,  0,  0,  0,480,  0,487,489,  0,463,465,413,416,467,472,419,
  483,422,496,498,503,509,  0,514,  0,  0,  0,  0,  0,  0,  0,519,521,523,
  525,527,441,529,444,531,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,558,  0,565,567,  0,533,535,537,539,541,457,460,463,543,466,545,
  550,469,561,472,574,576,581,587,592,  0,  0,  0,  0,  0,611,  0,618,620,
    0,594,596,496,598,603,499,614,502,627,629,634,640,  0
};

static const unsigned short ag_key_index[] = {
    7,  0, 13, 80,108,  0,  0, 13, 13,119,136,136,152,166,183,196,196,  0,
  217,243,  0,  0,243,254,  0,254,254,254,254,254,254,254,254,254,269,283,
    0,  0,293,119,119,119,119,269,183,183,183,183,305,305,305,312,319,324,
  324,324,358,324,398,411,398,  0,  0,152,152,119,152,166,425,425,  0,183,
    0,119,152,152,196,425,  0,152,  0,  0,183,  0,  0,  0,183,  0,196,439,
  183,196,152,  0,196,243,254,  0,  0,243,243,243,  0,254,  0,  0,152,  0,
  152,  0,  0,119,183,447,119,183,119,183,119,183,183,183,119,183,119,183,
  119,183,119,183,119,183,119,183,119,183,119,183,119,183,119,183,119,183,
  119,183,183,119,183,119,183,119,183,119,183,119,183,119,183,119,183,119,
  183,119,183,119,183,119,183,119,183,119,183,119,183,119,183,475,  0,196,
  183,183,  0,  0,  0,  0,183,505,  0,  0,  0,196,  0,  0,183,183,305,305,
  305,305,305,305,305,305,312,312,319,324,324,183,  0,  0,183,183,  0,425,
    0,183,  0,136,196,  0,254,254,324,183,324,  0,  0,  0,119,183,  0,183,
    0,217,196,  0,196
};

static const unsigned char ag_key_ends[] = {
111,76,111,111,112,0, 111,114,70,105,101,108,100,0, 114,105,112,116,0, 
97,116,101,109,101,110,116,0, 104,105,108,101,76,111,111,112,0, 
47,0, 61,0, 61,0, 61,0, 61,0, 114,101,97,107,0, 
111,110,116,105,110,117,101,0, 111,111,112,0, 98,108,101,0, 
109,112,0, 108,115,101,0, 105,101,108,100,0, 110,99,116,105,111,110,0, 
102,0, 97,108,0, 103,0, 114,105,110,116,0, 101,116,117,114,110,0, 
114,105,112,116,0, 97,116,101,109,101,110,116,0, 111,111,112,0, 
111,76,111,111,112,0, 111,114,70,105,101,108,100,0, 114,105,112,116,0, 
97,116,101,109,101,110,116,0, 104,105,108,101,76,111,111,112,0, 
43,0, 45,0, 43,0, 45,0, 114,101,97,107,0, 
111,110,116,105,110,117,101,0, 109,112,0, 114,0, 
110,99,116,105,111,110,0, 102,0, 114,105,110,116,0, 
101,116,117,114,110,0, 104,105,108,101,0, 43,0, 45,0, 
114,101,97,107,0, 111,110,116,105,110,117,101,0, 109,112,0, 114,0, 
110,99,116,105,111,110,0, 102,0, 111,99,97,108,0, 114,105,110,116,0, 
101,116,117,114,110,0, 104,105,108,101,0, 43,0, 45,0, 43,0, 
45,0, 114,101,97,107,0, 111,110,116,105,110,117,101,0, 109,112,0, 
114,0, 110,99,116,105,111,110,0, 102,0, 114,105,110,116,0, 
101,116,117,114,110,0, 104,105,108,101,0, 43,0, 45,0, 
114,101,97,107,0, 111,110,116,105,110,117,101,0, 109,112,0, 114,0, 
110,99,116,105,111,110,0, 102,0, 111,99,97,108,0, 114,105,110,116,0, 
101,116,117,114,110,0, 104,105,108,101,0, 61,0, 38,0, 42,0, 
61,0, 124,0, 61,0, 38,0, 42,0, 61,0, 124,0, 43,0, 45,0, 
111,117,98,108,101,0, 111,110,103,0, 43,0, 45,0, 
111,117,98,108,101,0, 111,110,103,0, 61,0, 38,0, 61,0, 124,0, 
61,0, 38,0, 61,0, 61,0, 61,0, 124,0, 61,0, 38,0, 61,0, 124,0, 
38,0, 124,0, 61,0, 61,0, 61,0, 61,0, 61,0, 61,0, 61,0, 61,0, 
61,0, 124,0, 43,0, 45,0, 114,101,97,107,0, 
111,110,116,105,110,117,101,0, 109,112,0, 108,115,101,0, 114,0, 
110,99,116,105,111,110,0, 102,0, 114,105,110,116,0, 
101,116,117,114,110,0, 104,105,108,101,0, 104,105,108,101,0, 61,0, 
38,0, 42,0, 43,0, 45,0, 61,0, 124,0, 61,0, 38,0, 42,0, 43,0, 
45,0, 61,0, 114,101,97,107,0, 111,110,116,105,110,117,101,0, 
109,112,0, 108,115,101,0, 114,0, 110,99,116,105,111,110,0, 102,0, 
114,105,110,116,0, 101,116,117,114,110,0, 104,105,108,101,0, 124,0, 
43,0, 45,0, 114,101,97,107,0, 111,110,116,105,110,117,101,0, 
109,112,0, 108,115,101,0, 114,0, 110,99,116,105,111,110,0, 102,0, 
114,105,110,116,0, 101,116,117,114,110,0, 104,105,108,101,0, 
};

#define AG_TCV(x) ag_tcv[(x)]

static const unsigned short ag_tcv[] = {
   15,192,192,192,192,192,192,192,192,191,137,191,191,191,192,192,192,192,
  192,192,192,192,192,192,192,192,192,192,192,192,192,192,191,254,163,192,
  192,253,240,188,212,203,251,249,219,250,144,252,156,193,193,193,193,193,
  193,193,155,155,234,204,243,222,245,235,192,194,194,194,194,141,194,195,
  195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,
  195,192,185,192,239,195,192,194,194,194,194,141,194,195,195,195,195,195,
  195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,216,238,215,
  255,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
  192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
  192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
  192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
  192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
  192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
  192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
  192,192,192,192
};

#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 INPUT_CODE
#define INPUT_CODE(T) (T)
#endif

typedef enum
  {ag_accept_key, ag_set_key, ag_jmp_key, ag_end_key, ag_no_match_key,
   ag_cf_accept_key, ag_cf_set_key, ag_cf_end_key} key_words;

static void ag_get_key_word(PCB_DECL, int ag_k) {
  int ag_save = (int) ((PCB).la_ptr - (PCB).pointer);
  const  unsigned char *ag_p;
  int ag_ch;
  while (1) {
    switch (ag_key_act[ag_k]) {
    case ag_cf_end_key: {
      const  unsigned char *sp = ag_key_ends + ag_key_jmp[ag_k];
      do {
        if ((ag_ch = *sp++) == 0) {
          int ag_k1 = ag_key_parm[ag_k];
          int ag_k2 = ag_key_pt[ag_k1];
          if (ag_key_itt[ag_k2 + CONVERT_CASE(*(PCB).la_ptr)]) goto ag_fail;
          (PCB).token_number = (dxi_token_type) ag_key_pt[ag_k1 + 1];
          return;
        }
      } while (CONVERT_CASE(*(PCB).la_ptr++) == ag_ch);
      goto ag_fail;
    }
    case ag_end_key: {
      const  unsigned char *sp = ag_key_ends + ag_key_jmp[ag_k];
      do {
        if ((ag_ch = *sp++) == 0) {
          (PCB).token_number = (dxi_token_type) ag_key_parm[ag_k];
          return;
        }
      } while (CONVERT_CASE(*(PCB).la_ptr++) == ag_ch);
    }
    case ag_no_match_key:
ag_fail:
      (PCB).la_ptr = (PCB).pointer + ag_save;
      return;
    case ag_cf_set_key: {
      int ag_k1 = ag_key_parm[ag_k];
      int ag_k2 = ag_key_pt[ag_k1];
      ag_k = ag_key_jmp[ag_k];
      if (ag_key_itt[ag_k2 + CONVERT_CASE(*(PCB).la_ptr)]) break;
      ag_save = (int) ((PCB).la_ptr - (PCB).pointer);
      (PCB).token_number = (dxi_token_type) ag_key_pt[ag_k1+1];
      break;
    }
    case ag_set_key:
      ag_save = (int) ((PCB).la_ptr - (PCB).pointer);
      (PCB).token_number = (dxi_token_type) ag_key_parm[ag_k];
    case ag_jmp_key:
      ag_k = ag_key_jmp[ag_k];
      break;
    case ag_accept_key:
      (PCB).token_number = (dxi_token_type) ag_key_parm[ag_k];
      return;
    case ag_cf_accept_key: {
      int ag_k1 = ag_key_parm[ag_k];
      int ag_k2 = ag_key_pt[ag_k1];
      if (ag_key_itt[ag_k2 + CONVERT_CASE(*(PCB).la_ptr)])
        (PCB).la_ptr = (PCB).pointer + ag_save;
      else (PCB).token_number = (dxi_token_type) ag_key_pt[ag_k1+1];
      return;
    }
    }
    ag_ch = CONVERT_CASE(*(PCB).la_ptr++);
    ag_p = &ag_key_ch[ag_k];
    if (ag_ch <= 255) while (*ag_p < ag_ch) ag_p++;
    if (ag_ch > 255 || *ag_p != ag_ch) {
      (PCB).la_ptr = (PCB).pointer + ag_save;
      return;
    }
    ag_k = (int) (ag_p - ag_key_ch);
  }
}


#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(PCB_DECL) {
  int ag_k = (int) ((PCB).la_ptr - (PCB).pointer);
  while (ag_k--) {
    switch (*(PCB).pointer++) {
    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++;
    }
  }
}


static void ag_prot(PCB_DECL) {
  int ag_k;
  ag_k = 128 - ++(PCB).btsx;
  if (ag_k <= (PCB).ssx) {
    (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];
  (PCB).cs[ag_k] = (PCB).cs[(PCB).ssx];
}

static void ag_undo(PCB_DECL) {
  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).cs[(PCB).ssx] = (PCB).cs[ag_k];
  }
  (PCB).token_number = (dxi_token_type) (PCB).drt;
  (PCB).ssx = (PCB).dssx;
  (PCB).sn = (PCB).dsn;
  (PCB).drt = -1;
}


static const unsigned short ag_tstt[] = {
191,137,133,128,25,24,23,22,21,0,1,196,197,
255,254,253,252,251,250,249,245,243,240,239,238,235,234,222,219,216,215,212,
  204,203,195,194,193,192,191,188,185,163,156,155,144,141,137,0,135,136,
255,254,253,252,251,250,249,245,243,240,239,238,235,234,222,219,216,215,212,
  204,203,195,194,193,192,191,188,185,163,156,155,144,141,137,132,0,130,
  131,
191,137,133,128,0,1,
25,24,23,22,21,0,7,8,9,10,11,12,198,199,200,201,202,
255,254,253,252,251,250,249,245,243,240,239,238,235,234,222,219,216,215,212,
  204,203,195,194,193,192,191,188,185,163,156,155,144,141,0,
137,0,
255,254,253,252,251,250,249,245,243,240,239,238,235,234,222,219,216,215,212,
  204,203,195,194,193,192,191,188,185,163,156,155,144,141,137,0,
132,0,
258,257,255,254,250,249,212,204,203,195,194,193,191,188,163,159,158,156,155,
  144,141,137,133,128,0,1,196,197,
258,257,255,254,250,249,221,220,218,216,213,212,210,209,208,207,206,205,204,
  195,194,193,191,188,163,159,158,156,155,144,141,137,133,128,0,1,196,197,
258,257,255,254,250,249,221,220,218,216,213,212,210,209,208,207,206,205,204,
  195,194,193,191,188,163,159,158,156,155,144,141,137,133,128,0,1,196,197,
212,191,137,133,128,0,1,196,197,
258,257,255,254,250,249,221,220,218,216,213,212,211,210,209,208,207,206,205,
  204,195,194,193,191,188,163,159,158,156,155,144,141,137,133,128,15,0,1,
  196,197,
258,257,255,254,250,249,212,204,203,195,194,193,188,163,159,158,156,155,144,
  141,0,2,3,4,5,6,19,37,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,
  108,109,113,114,115,116,118,119,120,121,126,140,143,146,147,148,152,160,
  217,261,262,263,264,
258,257,255,254,250,249,221,220,218,216,213,212,210,209,208,207,206,205,204,
  195,194,193,188,163,159,158,156,155,144,141,0,2,3,4,5,6,17,26,27,28,30,
  31,32,33,35,37,38,39,40,41,42,43,44,45,46,47,48,51,53,55,57,59,60,61,64,
  65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,115,116,118,119,
  120,121,126,140,143,146,147,148,152,160,217,261,262,263,264,
258,257,255,254,250,249,221,220,218,216,213,212,210,209,208,207,206,205,204,
  195,194,193,188,163,159,158,156,155,144,141,0,2,3,4,5,6,17,26,27,28,30,
  31,32,33,35,37,38,39,40,41,42,43,44,45,46,47,48,51,53,55,57,59,60,61,64,
  65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,115,116,118,119,
  120,121,126,140,143,146,147,148,152,160,217,261,262,263,264,
212,0,16,51,
258,257,255,254,250,249,221,220,218,216,213,212,211,210,209,208,207,206,205,
  204,195,194,193,188,163,159,158,156,155,144,141,15,0,13,49,
255,254,253,252,251,250,249,245,243,240,239,238,235,234,222,219,216,215,212,
  204,203,195,194,193,192,191,188,186,185,181,180,179,178,177,176,175,174,
  173,172,171,163,156,155,144,141,0,164,
193,156,155,0,151,
193,156,155,0,145,151,
255,254,253,252,251,250,249,245,243,240,239,238,235,234,222,219,216,215,212,
  204,203,195,194,193,192,191,186,185,181,180,179,178,177,176,175,174,173,
  172,171,163,156,155,144,141,0,167,168,169,170,182,183,184,189,
256,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,
  235,234,219,204,203,191,163,137,133,128,0,1,196,197,
144,141,0,
141,0,
194,193,156,155,141,0,161,
256,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,
  235,234,219,204,203,193,191,156,155,144,141,137,133,128,0,
256,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,
  235,234,219,204,203,193,191,156,155,144,141,137,133,128,0,151,
256,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,
  235,234,219,204,203,191,137,133,128,0,1,196,197,
256,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,
  235,234,219,204,203,191,137,133,128,0,1,196,197,
256,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,
  235,234,219,204,203,191,137,133,128,0,1,196,197,
256,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,
  235,234,219,204,203,195,194,191,141,137,133,128,0,1,196,197,
256,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,
  235,234,219,204,203,195,194,191,141,137,133,128,0,1,196,197,
163,0,5,264,
260,259,258,257,255,254,250,249,212,204,203,195,194,193,191,188,163,159,158,
  156,155,144,141,137,133,128,0,1,196,197,
195,194,141,0,4,65,217,
195,194,141,0,4,65,217,
260,259,258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,
  141,0,2,3,4,5,6,37,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,
  109,113,114,115,116,118,119,120,121,122,123,126,140,143,146,147,148,152,
  160,217,261,262,263,264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
256,0,117,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,107,108,109,113,114,115,116,118,119,120,121,126,140,143,
  146,147,148,152,160,217,261,262,263,264,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,107,108,109,113,114,115,116,118,119,120,121,126,140,143,
  146,147,148,152,160,217,261,262,263,264,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,107,108,109,113,114,115,116,118,119,120,121,126,140,143,
  146,147,148,152,160,217,261,262,263,264,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,107,108,109,113,114,115,116,118,119,120,121,126,140,143,
  146,147,148,152,160,217,261,262,263,264,
253,252,251,0,110,111,112,
250,249,0,107,108,
248,247,0,104,105,
246,245,244,243,0,99,100,101,102,
242,241,0,96,97,
240,0,94,
239,0,92,
238,0,90,
258,257,256,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,
  237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,219,212,
  204,203,195,194,193,191,156,155,141,137,133,128,0,1,196,197,
237,0,87,
212,0,51,
236,235,0,79,84,
258,257,233,232,231,230,229,228,227,226,225,224,223,222,0,66,67,68,69,70,71,
  72,73,74,75,76,77,119,120,
219,0,58,
204,203,0,35,36,
212,191,137,133,128,0,1,196,197,
195,194,191,141,137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
195,194,191,141,137,133,128,0,1,196,197,
258,257,255,254,250,249,221,220,218,216,215,213,212,211,210,209,208,207,206,
  205,204,195,194,193,191,188,163,159,158,156,155,144,141,137,133,128,0,1,
  196,197,
258,257,255,254,250,249,221,220,218,216,215,214,213,212,210,209,208,207,206,
  205,204,195,194,193,191,188,163,159,158,156,155,144,141,137,133,128,15,
  0,1,196,197,
258,257,255,254,250,249,221,220,218,216,215,214,213,212,210,209,208,207,206,
  205,204,195,194,193,191,188,163,159,158,156,155,144,141,137,133,128,15,
  0,1,196,197,
195,194,141,0,4,217,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,
  115,116,118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,
  264,
195,194,141,0,4,217,
258,257,255,254,250,249,212,204,195,194,193,191,188,163,159,158,156,155,144,
  141,137,133,128,0,1,196,197,
204,191,137,133,128,0,1,196,197,
204,191,137,133,128,0,1,196,197,
258,257,255,254,250,249,221,220,218,216,215,213,212,210,209,208,207,206,205,
  204,195,194,193,188,163,159,158,156,155,144,141,0,14,
258,257,255,254,250,249,221,220,218,216,215,214,213,212,210,209,208,207,206,
  205,204,203,195,194,193,191,188,163,159,158,156,155,144,141,137,133,128,
  15,0,1,196,197,
212,0,51,
212,191,137,133,128,0,1,196,197,
219,204,0,35,58,
219,204,0,35,58,
258,257,255,254,250,249,212,204,195,194,193,188,163,159,158,156,155,144,141,
  0,2,3,4,5,6,19,37,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,
  109,113,114,115,116,118,119,120,121,126,140,143,146,147,148,152,160,217,
  261,262,263,264,
204,0,35,
204,0,35,
219,204,0,35,58,
258,257,255,254,250,249,212,204,195,194,193,188,163,159,158,156,155,144,141,
  0,2,3,4,5,6,34,37,51,52,60,64,65,78,83,86,89,91,93,95,98,103,106,107,
  108,109,113,114,115,116,118,119,120,121,126,140,143,146,147,148,152,160,
  217,261,262,263,264,
212,0,51,
258,257,255,254,250,249,221,220,218,216,213,212,210,209,208,207,206,205,204,
  195,194,193,188,163,159,158,156,155,144,141,0,2,3,4,5,6,17,26,27,28,30,
  31,32,33,35,37,38,39,40,41,42,43,44,45,46,47,48,51,53,55,57,59,60,61,64,
  65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,115,116,118,119,
  120,121,126,140,143,146,147,148,152,160,217,261,262,263,264,
209,0,18,46,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,37,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,
  114,115,116,118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,
  263,264,
258,257,255,254,250,249,221,220,218,216,213,212,210,209,208,207,206,205,204,
  195,194,193,188,163,159,158,156,155,144,141,0,2,3,4,5,6,17,26,27,28,30,
  31,32,33,35,37,38,39,40,41,42,43,44,45,46,47,48,51,53,55,57,59,60,61,64,
  65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,115,116,118,119,
  120,121,126,140,143,146,147,148,152,160,217,261,262,263,264,
195,194,191,141,137,133,128,0,1,196,197,
195,194,141,0,4,50,217,
258,257,255,254,250,249,221,220,218,216,213,212,210,209,208,207,206,205,204,
  195,194,193,188,163,159,158,156,155,144,141,15,0,14,
255,254,253,252,251,250,249,245,243,240,239,238,235,234,222,219,216,215,212,
  204,203,195,194,193,192,191,188,186,185,181,180,179,178,177,176,175,174,
  173,172,171,163,156,155,144,141,0,165,167,168,169,170,182,183,184,
193,156,155,0,145,151,
193,156,0,
194,193,156,155,141,0,187,
193,156,0,
193,156,0,
194,193,156,155,141,0,187,
188,0,
193,156,155,0,145,151,
250,249,193,156,155,0,142,149,
250,249,193,156,155,0,142,149,
203,191,137,133,128,0,1,196,197,
203,0,36,
203,191,137,133,128,0,1,196,197,
203,0,36,
219,203,0,36,58,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,107,108,109,113,114,115,116,118,119,120,121,126,140,143,
  146,147,148,152,160,217,261,262,263,264,
258,257,0,119,120,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,107,108,109,113,114,115,116,118,119,120,121,126,140,143,
  146,147,148,152,160,217,261,262,263,264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,107,108,109,113,114,115,116,118,119,120,121,126,140,143,
  146,147,148,152,160,217,261,262,263,264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,107,108,109,113,114,115,116,118,119,120,121,126,140,143,
  146,147,148,152,160,217,261,262,263,264,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,106,107,108,109,113,114,115,116,118,119,120,121,126,140,
  143,146,147,148,152,160,217,261,262,263,264,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,106,107,108,109,113,114,115,116,118,119,120,121,126,140,
  143,146,147,148,152,160,217,261,262,263,264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,103,106,107,108,109,113,114,115,116,118,119,120,121,126,
  140,143,146,147,148,152,160,217,261,262,263,264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,103,106,107,108,109,113,114,115,116,118,119,120,121,126,
  140,143,146,147,148,152,160,217,261,262,263,264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,98,103,106,107,108,109,113,114,115,116,118,119,120,121,
  126,140,143,146,147,148,152,160,217,261,262,263,264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,98,103,106,107,108,109,113,114,115,116,118,119,120,121,
  126,140,143,146,147,148,152,160,217,261,262,263,264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,98,103,106,107,108,109,113,114,115,116,118,119,120,121,
  126,140,143,146,147,148,152,160,217,261,262,263,264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,98,103,106,107,108,109,113,114,115,116,118,119,120,121,
  126,140,143,146,147,148,152,160,217,261,262,263,264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,95,98,103,106,107,108,109,113,114,115,116,118,119,120,121,
  126,140,143,146,147,148,152,160,217,261,262,263,264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,95,98,103,106,107,108,109,113,114,115,116,118,119,120,121,
  126,140,143,146,147,148,152,160,217,261,262,263,264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,93,95,98,103,106,107,108,109,113,114,115,116,118,119,120,
  121,126,140,143,146,147,148,152,160,217,261,262,263,264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,91,93,95,98,103,106,107,108,109,113,114,115,116,118,119,
  120,121,126,140,143,146,147,148,152,160,217,261,262,263,264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,89,91,93,95,98,103,106,107,108,109,113,114,115,116,118,
  119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,
  88,
258,257,255,254,250,249,212,203,195,194,193,188,163,159,158,156,155,144,141,
  0,2,3,4,5,6,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,
  114,115,116,118,119,120,121,124,125,126,140,143,146,147,148,152,160,217,
  261,262,263,264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,
  85,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,
  80,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,
  115,116,118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,
  264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,
  115,116,118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,
  264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,
  115,116,118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,
  264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,
  115,116,118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,
  264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,
  115,116,118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,
  264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,
  115,116,118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,
  264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,
  115,116,118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,
  264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,
  115,116,118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,
  264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,
  115,116,118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,
  264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,
  115,116,118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,
  264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,
  115,116,118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,
  264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,
  115,116,118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,
  264,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,
  115,116,118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,
  264,
258,257,256,255,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,
  239,238,237,236,235,234,221,220,219,218,216,215,214,213,212,210,209,208,
  207,206,205,204,203,195,194,193,191,188,163,159,158,156,155,144,141,137,
  133,128,15,0,1,196,197,
212,0,51,
258,257,255,254,250,249,221,220,218,216,215,213,212,210,209,208,207,206,205,
  204,195,194,193,188,163,159,158,156,155,144,141,0,2,3,4,5,6,17,26,27,28,
  30,31,32,33,35,37,38,39,40,41,42,43,44,45,46,47,48,51,53,55,56,57,59,60,
  61,64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,115,116,
  118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,264,
258,257,255,254,250,249,212,204,195,194,193,188,163,159,158,156,155,144,141,
  0,2,3,4,5,6,19,37,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,
  109,113,114,115,116,118,119,120,121,126,140,143,146,147,148,152,160,217,
  261,262,263,264,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,
  115,116,118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,
  264,
195,194,141,0,4,217,
204,0,35,
219,0,58,
204,0,35,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,37,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,
  114,115,116,118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,
  263,264,
214,0,29,54,
212,0,16,51,
219,203,0,36,58,
219,204,0,35,58,
258,257,255,254,250,249,221,220,218,216,213,212,210,209,208,207,206,205,204,
  195,194,193,188,163,159,158,156,155,144,141,15,0,2,3,4,5,6,17,26,27,28,
  30,31,32,33,35,37,38,39,40,41,42,43,44,45,46,47,48,51,53,55,57,59,60,61,
  64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,115,116,118,
  119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,264,
193,156,155,0,150,
193,156,155,0,150,
258,257,212,195,194,193,188,163,159,158,156,155,144,141,0,2,3,4,5,6,51,65,
  116,118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,264,
258,257,212,195,194,193,188,163,159,158,156,155,144,141,0,2,3,4,5,6,51,65,
  116,118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,264,
253,252,251,0,110,111,112,
253,252,251,0,110,111,112,
250,249,0,107,108,
250,249,0,107,108,
248,247,0,104,105,
248,247,0,104,105,
248,247,0,104,105,
248,247,0,104,105,
246,245,244,243,0,99,100,101,102,
246,245,244,243,0,99,100,101,102,
242,241,0,96,97,
240,0,94,
239,0,92,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,86,89,91,93,95,98,103,106,107,108,109,113,114,115,116,118,
  119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,264,
219,0,58,
203,0,36,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,65,83,86,89,91,93,95,98,103,106,107,108,109,113,114,115,116,
  118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,264,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,37,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,
  114,115,116,118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,
  263,264,
195,194,141,0,4,50,217,
258,257,255,254,250,249,221,220,218,216,215,214,213,212,210,209,208,207,206,
  205,204,195,194,193,191,188,163,159,158,156,155,144,141,137,133,128,15,
  0,1,196,197,
204,0,35,
258,257,255,254,250,249,212,203,195,194,193,188,163,159,158,156,155,144,141,
  0,2,3,4,5,6,34,37,51,52,60,64,65,78,83,86,89,91,93,95,98,103,106,107,
  108,109,113,114,115,116,118,119,120,121,126,140,143,146,147,148,152,160,
  217,261,262,263,264,
219,203,0,36,58,
258,257,255,254,250,249,221,220,218,216,213,212,210,209,208,207,206,205,204,
  195,194,193,191,188,163,159,158,156,155,144,141,137,133,128,0,1,196,197,
258,257,255,254,250,249,221,220,218,216,213,212,210,209,208,207,206,205,204,
  195,194,193,188,163,159,158,156,155,144,141,0,2,3,4,5,6,26,27,28,30,31,
  32,33,35,37,38,39,40,41,42,43,44,45,46,47,48,51,53,55,57,59,60,61,64,65,
  78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,115,116,118,119,120,
  121,126,140,143,146,147,148,152,160,217,261,262,263,264,
195,194,141,0,4,217,
193,156,155,0,151,
193,156,155,0,151,
238,0,90,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,60,64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,
  115,116,118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,
  264,
237,0,87,
234,219,0,58,81,
219,203,0,36,58,
203,0,36,
258,257,255,254,250,249,212,195,194,193,191,188,163,159,158,156,155,144,141,
  137,133,128,0,1,196,197,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,
  82,
216,0,62,
258,257,255,254,250,249,212,195,194,193,188,163,159,158,156,155,144,141,0,2,
  3,4,5,6,51,64,65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,
  115,116,118,119,120,121,126,140,143,146,147,148,152,160,217,261,262,263,
  264,
216,0,55,
258,257,255,254,250,249,221,220,218,216,215,213,212,211,210,209,208,207,206,
  205,204,195,194,193,188,163,159,158,156,155,144,141,0,13,49,63,
258,257,255,254,250,249,221,220,218,216,215,213,212,210,209,208,207,206,205,
  204,195,194,193,188,163,159,158,156,155,144,141,0,14,
215,0,56,
258,257,255,254,250,249,221,220,218,216,213,212,210,209,208,207,206,205,204,
  195,194,193,188,163,159,158,156,155,144,141,0,2,3,4,5,6,17,26,27,28,30,
  31,32,33,35,37,38,39,40,41,42,43,44,45,46,47,48,51,53,55,57,59,60,61,64,
  65,78,83,86,89,91,93,95,98,103,106,107,108,109,113,114,115,116,118,119,
  120,121,126,140,143,146,147,148,152,160,217,261,262,263,264,

};


static unsigned const char ag_astt[6707] = {
  1,1,1,1,8,8,8,8,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,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,8,7,1,1,9,9,1,1,5,3,2,2,2,2,2,7,1,1,1,1,1,0,1,1,1,1,1,
  9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,5,3,7,9,
  9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,5,3,7,5,
  5,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,5,5,5,5,5,5,5,5,5,5,
  5,5,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,5,5,5,5,5,5,5,5,5,
  5,5,5,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,5,1,1,1,1,7,1,1,
  3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,5,
  7,1,1,3,1,1,1,1,1,1,1,4,4,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,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,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,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,2,2,2,1,2,
  2,2,1,2,1,2,1,1,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,1,1,1,1,
  1,1,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,1,1,1,1,
  1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,
  1,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,2,1,1,1,1,1,1,7,1,1,8,8,8,8,8,8,8,8,8,8,8,8,1,8,8,8,8,8,8,8,8,8,
  8,8,8,8,8,8,8,8,8,5,7,1,1,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
  4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,7,1,10,10,10,4,2,1,1,1,7,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,2,2,2,2,2,2,2,2,2,2,
  1,1,1,1,1,7,1,1,1,1,1,1,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,1,5,1,1,1,7,1,1,3,1,1,7,1,5,2,2,2,2,2,5,2,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
  5,5,5,5,5,5,5,5,5,10,5,10,2,4,4,5,5,5,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,10,5,10,10,4,4,5,5,5,7,2,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
  5,5,5,5,5,5,1,1,1,1,7,1,1,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
  5,1,1,1,1,7,1,1,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,1,1,
  7,1,1,3,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,1,5,1,1,1,7,1,
  1,3,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,1,5,1,1,1,7,1,1,3,
  1,5,2,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,2,2,2,
  7,2,2,1,2,2,2,7,2,2,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,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,2,1,
  1,1,1,1,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,5,5,5,5,5,5,5,
  5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,
  5,1,1,1,7,1,1,3,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,1,5,1,
  1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,1,1,1,1,2,2,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,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,
  1,1,1,1,2,2,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,2,2,2,1,
  1,2,2,2,2,1,2,7,2,2,1,1,2,1,1,1,1,2,2,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,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,1,1,1,1,2,2,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,5,1,1,1,1,1,5,1,1,1,1,5,1,1,1,1,1,1,5,
  1,1,1,1,1,1,5,1,1,1,5,1,1,5,1,1,5,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,5,5,5,5,5,5,5,5,5,5,5,10,10,10,1,10,10,10,1,1,1,7,1,1,3,
  1,5,1,1,4,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,
  1,2,2,1,5,1,1,1,7,2,2,5,1,1,1,1,7,1,1,3,5,5,1,5,1,1,1,7,1,1,3,5,5,5,5,5,5,
  5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,5,5,1,5,1,1,1,7,1,1,3,5,5,5,5,5,5,
  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,5,5,5,
  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,5,7,1,1,
  3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,
  5,7,1,1,3,2,2,2,7,1,1,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,1,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,1,1,1,1,1,2,
  2,2,7,2,1,5,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,5,1,1,1,1,
  7,1,1,3,5,1,1,1,1,7,1,1,3,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
  8,8,8,8,8,8,8,7,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,1,5,5,
  5,5,5,5,5,5,1,1,1,5,7,1,1,3,1,7,1,5,1,1,1,1,7,1,1,3,1,1,7,3,1,1,1,7,3,1,1,
  1,1,1,1,1,1,4,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,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,2,1,1,1,1,1,1,7,2,1,7,2,1,1,7,3,
  1,1,1,1,1,1,1,1,5,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,1,1,1,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,2,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,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,2,2,1,1,1,
  2,2,1,1,1,1,1,1,1,1,1,1,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,2,1,1,1,1,1,1,7,1,2,1,1,1,1,1,1,1,2,2,2,1,
  1,2,2,2,2,1,2,7,2,2,1,1,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,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,2,2,2,
  1,1,2,2,2,2,1,2,7,2,2,1,1,2,2,2,2,1,2,2,2,1,2,1,2,1,1,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,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,
  1,1,1,1,5,5,1,5,1,1,1,7,1,1,3,2,2,2,7,2,1,1,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
  8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,7,1,10,10,10,10,10,10,10,10,10,10,10,10,10,
  10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,2,2,2,2,2,2,2,2,2,2,2,2,10,
  10,10,10,7,2,2,2,2,1,1,1,2,1,1,1,4,2,1,2,2,7,2,2,2,2,2,7,2,2,2,5,2,2,5,2,2,
  2,2,2,5,2,2,7,1,1,1,4,2,1,1,1,8,8,8,7,2,1,1,1,8,8,8,7,2,1,5,1,1,1,1,7,1,1,
  3,1,7,1,5,1,1,1,1,7,1,1,3,1,7,1,1,1,7,2,1,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,
  5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,1,1,1,
  1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,4,2,2,5,5,5,5,5,5,5,5,5,
  5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,
  2,1,1,2,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,5,5,5,5,5,5,5,
  5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,
  7,2,2,1,1,2,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,5,5,5,5,5,
  5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,
  1,2,7,2,2,1,1,2,1,1,1,1,2,2,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,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,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,1,1,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,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,1,1,5,5,5,5,5,5,5,5,5,5,1,5,
  5,5,5,5,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,
  2,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,1,1,5,5,5,5,5,5,5,5,
  5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,
  2,2,1,1,2,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,1,1,5,5,5,5,
  5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,
  2,1,2,7,2,2,1,1,2,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,1,
  1,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,2,
  1,1,2,2,2,2,1,2,7,2,2,1,1,2,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,1,1,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,
  1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,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,1,1,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,
  1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,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,1,1,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,
  1,7,1,1,3,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,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,2,1,1,1,1,1,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,
  5,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,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,2,1,1,1,1,1,5,5,5,5,5,5,5,5,5,
  5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,
  2,1,1,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,2,1,1,1,1,1,5,5,
  5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,2,1,1,2,
  2,2,2,1,2,7,2,2,1,1,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,1,1,1,1,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,
  1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,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,2,1,1,1,1,1,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,
  7,1,1,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,7,1,1,1,1,1,1,1,1,4,2,2,2,1,1,
  2,2,2,2,1,2,7,2,2,1,1,2,1,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,2,1,1,1,1,1,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,
  7,1,1,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,7,1,5,5,5,5,5,5,5,5,5,5,1,5,5,
  5,5,5,5,5,5,1,1,1,7,1,1,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,7,1,5,5,5,5,
  5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,
  2,1,2,7,2,2,1,1,2,1,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,1,1,1,1,1,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,1,
  1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,1,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,1,1,1,1,1,5,5,5,5,5,5,5,5,5,5,1,5,5,
  5,5,5,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,
  1,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,1,1,1,1,
  1,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,2,
  1,1,2,2,2,2,1,2,7,2,2,1,1,2,1,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,1,1,1,1,1,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,
  7,1,1,3,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,1,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,1,1,1,1,1,5,5,5,5,5,5,5,5,
  5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,
  2,2,1,1,2,1,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,1,1,1,1,1,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,
  1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,1,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,1,1,1,1,1,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,
  5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,1,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,1,1,1,1,1,5,5,5,
  5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,2,1,1,2,2,
  2,2,1,2,7,2,2,1,1,2,1,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,1,1,1,1,1,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,
  1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,1,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,1,1,1,1,1,5,5,5,5,5,5,5,5,5,5,1,5,
  5,5,5,5,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,
  2,1,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,1,1,1,
  1,1,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,
  2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,1,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,1,1,1,1,1,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,
  1,7,1,1,3,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,1,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,1,1,1,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,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
  5,1,5,5,5,5,5,5,5,5,1,1,1,5,7,1,1,3,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,3,3,3,1,3,2,2,1,3,1,3,1,1,1,1,1,
  3,2,2,1,1,1,1,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,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,4,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,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,2,1,1,
  1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,1,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,1,1,1,1,1,2,2,2,7,2,1,1,7,2,
  1,5,1,1,7,1,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,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,2,1,1,1,1,1,1,5,1,2,1,
  7,2,1,1,1,7,2,1,1,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,
  2,2,2,2,1,2,2,7,2,2,1,1,2,3,3,3,1,3,2,2,1,3,1,3,1,1,1,1,1,3,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,2,1,1,
  1,1,1,2,2,2,7,1,2,2,2,7,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,1,1,2,2,
  1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,1,
  1,2,2,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,4,1,1,1,1,1,4,1,
  1,1,1,4,1,1,1,1,4,1,1,1,1,4,1,1,1,1,4,1,1,1,1,4,1,1,1,1,1,1,4,1,1,1,1,1,1,
  1,1,4,1,1,1,1,1,1,4,1,1,1,4,1,1,4,1,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,
  2,2,1,1,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,2,1,1,1,
  1,1,1,5,1,1,7,2,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,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,1,1,1,1,1,1,1,1,1,1,1,1,
  2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,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,2,1,1,1,1,1,2,2,2,7,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,1,5,5,5,5,5,5,5,5,1,1,1,5,7,1,1,3,1,7,2,1,1,1,1,
  1,1,1,5,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,1,1,1,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,2,1,1,1,1,1,1,1,7,2,1,5,5,5,5,5,5,5,
  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,2,2,1,2,2,2,1,
  2,1,2,1,1,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,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,2,2,2,7,2,1,10,10,10,4,2,10,10,10,4,
  2,1,4,1,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,2,7,2,2,1,1,2,1,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,1,1,1,1,1,1,4,1,1,1,7,1,1,
  1,1,7,1,1,1,7,2,5,5,5,5,5,5,5,5,5,5,1,5,5,5,5,5,5,5,5,1,1,1,7,1,1,3,4,4,4,
  4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,7,1,4,7,1,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,
  2,7,2,2,1,1,2,1,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,1,1,1,1,1,1,7,1,8,8,8,8,8,8,8,8,8,8,5,8,8,1,8,8,8,8,8,8,8,8,8,8,8,8,8,
  8,8,8,8,8,7,1,1,1,8,8,8,8,8,8,8,8,8,8,5,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
  8,8,8,7,1,1,7,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,2,2,2,2,1,
  2,4,2,2,1,1,2,3,3,3,1,3,2,2,1,3,1,3,1,1,1,1,1,3,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,2,1,1,1,1,1
};


static const unsigned short ag_pstt[] = {
3,3,1,2,4,4,4,4,4,0,3,3,4,
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,5,5,5,5,5,6,1,5,6,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,2,7,8,
364,364,1,2,366,364,
10,9,8,7,6,4,18,17,16,15,14,0,13,12,11,10,9,
139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,
  139,139,139,139,139,139,139,139,139,139,139,139,139,139,141,
142,6,
134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,
  134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,136,
137,8,
365,365,365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,
  365,365,3,1,2,9,3,3,371,
365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
  365,365,365,3,365,365,365,365,365,365,365,365,3,1,2,10,3,3,370,
365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
  365,365,365,3,365,365,365,365,365,365,365,365,3,1,2,11,3,3,369,
365,3,3,1,2,12,3,3,368,
365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
  365,365,365,365,3,365,365,365,365,365,365,365,365,3,1,2,365,13,3,3,367,
32,33,39,40,41,42,35,54,54,143,143,163,22,19,173,173,169,163,21,143,14,128,
  129,58,34,131,62,61,38,61,61,60,59,57,55,54,53,52,51,50,49,48,47,46,48,
  48,45,44,43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
32,33,39,40,41,42,64,65,66,67,79,35,63,68,69,73,74,75,77,143,143,163,22,19,
  173,173,169,163,21,143,15,128,129,58,34,131,4,4,4,88,4,19,20,86,4,85,4,
  84,83,82,81,80,4,19,20,78,78,38,87,76,72,71,85,70,85,60,59,57,55,54,53,
  52,51,50,49,48,47,46,48,48,45,44,43,43,37,36,43,34,25,24,28,20,27,26,
  173,56,31,30,29,23,
32,33,39,40,41,42,64,65,66,67,79,35,63,68,69,73,74,75,77,143,143,163,22,19,
  173,173,169,163,21,143,16,128,129,58,34,131,89,89,89,88,89,19,20,86,89,
  85,89,84,83,82,81,80,89,19,20,78,78,38,87,76,72,71,85,70,85,60,59,57,55,
  54,53,52,51,50,49,48,47,46,48,48,45,44,43,43,37,36,43,34,25,24,28,20,27,
  26,173,56,31,30,29,23,
35,17,91,90,
94,94,94,94,94,94,94,94,94,94,94,94,92,94,94,94,94,94,94,94,94,94,94,94,94,
  94,94,94,94,94,94,35,18,94,93,
180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
  180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
  180,180,180,180,180,180,180,180,19,95,
168,168,168,152,168,
96,96,96,21,150,96,
102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
  102,102,102,102,102,102,102,98,97,197,196,195,194,193,192,191,190,189,
  188,187,102,102,102,102,102,22,102,102,102,101,100,99,102,102,
365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
  365,365,365,365,365,3,365,3,1,2,23,3,3,433,
103,104,24,
105,145,
176,175,175,175,176,162,174,
161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
  161,161,161,161,161,170,161,170,167,153,153,161,161,161,27,
160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
  160,160,160,160,160,164,160,164,164,151,151,160,160,160,28,164,
365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
  365,365,365,365,365,3,3,1,2,29,3,3,432,
365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
  365,365,365,365,365,3,3,1,2,30,3,3,431,
365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
  365,365,365,365,365,3,3,1,2,31,3,3,430,
365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
  365,365,365,365,365,365,365,3,365,3,1,2,32,3,3,427,
365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
  365,365,365,365,365,365,365,3,365,3,1,2,33,3,3,426,
19,130,178,23,
365,365,365,365,365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,
  365,365,365,365,3,1,2,35,3,3,381,
143,143,143,36,122,116,56,
143,143,143,37,122,115,56,
106,108,32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,38,
  128,129,58,34,131,110,38,110,110,60,59,57,55,54,53,52,51,50,49,48,47,46,
  48,48,45,44,43,43,37,36,43,109,107,34,25,24,28,20,27,26,173,56,31,30,29,
  23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,39,3,3,424,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,40,3,3,423,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,41,3,3,419,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,42,3,3,418,
111,110,112,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,44,128,129,58,
  34,131,38,113,47,46,109,109,45,44,43,43,37,36,43,34,25,24,28,20,27,26,
  173,56,31,30,29,23,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,45,128,129,58,
  34,131,38,113,47,46,108,108,45,44,43,43,37,36,43,34,25,24,28,20,27,26,
  173,56,31,30,29,23,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,46,128,129,58,
  34,131,38,113,47,46,107,107,45,44,43,43,37,36,43,34,25,24,28,20,27,26,
  173,56,31,30,29,23,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,47,128,129,58,
  34,131,38,113,47,46,106,106,45,44,43,43,37,36,43,34,25,24,28,20,27,26,
  173,56,31,30,29,23,
114,116,118,98,119,117,115,
41,42,95,121,120,
122,124,90,125,123,
126,128,130,132,87,133,131,129,127,
134,136,85,137,135,
138,83,139,
140,81,141,
142,78,143,
365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
  365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
  365,365,144,144,144,3,144,144,144,3,1,2,56,3,3,386,
144,75,145,
35,122,146,
147,149,71,150,148,
32,33,151,153,155,157,159,161,163,165,167,169,171,173,114,174,172,170,168,
  166,164,162,160,158,156,154,152,117,118,
175,55,176,
77,177,62,5,5,
365,3,3,1,2,63,3,3,379,
365,365,3,365,3,1,2,64,3,3,390,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,65,3,3,389,
365,365,3,365,3,1,2,66,3,3,387,
365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
  365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,1,2,67,3,3,385,
365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
  365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,1,2,365,68,3,3,
  378,
365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
  365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,1,2,365,69,3,3,
  377,
143,143,143,70,178,56,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,71,128,129,58,
  34,131,38,47,47,60,59,57,55,54,53,52,51,50,49,48,47,46,48,48,45,44,43,
  43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
143,143,143,72,45,56,
365,365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,
  365,3,1,2,73,3,3,376,
365,3,3,1,2,74,3,3,375,
365,3,3,1,2,75,3,3,374,
179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
  179,179,179,179,179,179,179,179,179,179,179,179,76,179,
365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
  365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,1,2,365,77,
  3,3,373,
35,78,180,
365,3,3,1,2,79,3,3,382,
175,77,80,29,181,
175,77,81,28,182,
32,33,39,40,41,42,35,54,143,143,163,22,19,173,173,169,163,21,143,82,128,129,
  58,34,131,183,61,38,61,61,60,59,57,55,54,53,52,51,50,49,48,47,46,48,48,
  45,44,43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
77,83,26,
77,84,25,
175,77,85,22,176,
32,33,39,40,41,42,35,39,143,143,163,22,19,173,173,169,163,21,143,86,128,129,
  58,34,131,185,184,38,41,184,184,60,59,57,55,54,53,52,51,50,49,48,47,46,
  48,48,45,44,43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
35,87,186,
32,33,39,40,41,42,64,65,66,67,79,35,63,68,69,73,74,75,77,143,143,163,22,19,
  173,173,169,163,21,143,88,128,129,58,34,131,15,15,187,88,187,19,20,86,
  187,85,187,84,83,82,81,80,187,19,20,78,78,38,87,76,72,71,85,70,85,60,59,
  57,55,54,53,52,51,50,49,48,47,46,48,48,45,44,43,43,37,36,43,34,25,24,28,
  20,27,26,173,56,31,30,29,23,
68,89,188,34,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,90,128,129,58,
  34,131,189,38,189,189,60,59,57,55,54,53,52,51,50,49,48,47,46,48,48,45,
  44,43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
32,33,39,40,41,42,64,65,66,67,79,35,63,68,69,73,74,75,77,143,143,163,22,19,
  173,173,169,163,21,143,91,128,129,58,34,131,2,2,2,88,2,19,20,86,2,85,2,
  84,83,82,81,80,2,19,20,78,78,38,87,76,72,71,85,70,85,60,59,57,55,54,53,
  52,51,50,49,48,47,46,48,48,45,44,43,43,37,36,43,34,25,24,28,20,27,26,
  173,56,31,30,29,23,
365,365,3,365,3,1,2,92,3,3,380,
143,143,143,93,52,190,56,
191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
  191,191,191,191,191,191,191,191,191,191,191,191,94,191,
181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
  181,181,181,181,181,181,181,181,98,97,197,196,195,194,193,192,191,190,
  189,188,187,179,181,181,181,181,95,181,181,181,181,101,100,99,181,
96,96,96,158,159,96,
201,201,97,
207,206,206,206,207,98,204,
203,203,199,
202,202,198,
207,206,206,206,207,186,205,
208,102,
96,96,96,149,148,96,
192,193,193,193,193,104,147,193,
192,193,193,193,193,105,146,193,
365,3,3,1,2,106,3,3,429,
177,107,194,
365,3,3,1,2,108,3,3,428,
177,109,195,
175,177,110,112,176,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,111,3,3,425,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,112,128,129,
  58,34,131,38,113,47,46,111,111,45,44,43,43,37,36,43,34,25,24,28,20,27,
  26,173,56,31,30,29,23,
32,33,114,117,118,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,114,3,3,422,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,115,128,129,
  58,34,131,38,113,47,46,104,104,45,44,43,43,37,36,43,34,25,24,28,20,27,
  26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,116,3,3,421,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,117,128,129,
  58,34,131,38,113,47,46,103,103,45,44,43,43,37,36,43,34,25,24,28,20,27,
  26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,118,3,3,420,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,119,128,129,
  58,34,131,38,113,47,46,102,102,45,44,43,43,37,36,43,34,25,24,28,20,27,
  26,173,56,31,30,29,23,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,120,128,129,
  58,34,131,38,113,196,47,46,196,196,45,44,43,43,37,36,43,34,25,24,28,20,
  27,26,173,56,31,30,29,23,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,121,128,129,
  58,34,131,38,113,197,47,46,197,197,45,44,43,43,37,36,43,34,25,24,28,20,
  27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,122,3,3,417,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,123,128,129,
  58,34,131,38,113,198,48,47,46,48,48,45,44,43,43,37,36,43,34,25,24,28,20,
  27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,124,3,3,416,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,125,128,129,
  58,34,131,38,113,199,48,47,46,48,48,45,44,43,43,37,36,43,34,25,24,28,20,
  27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,126,3,3,415,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,127,128,129,
  58,34,131,38,113,200,49,48,47,46,48,48,45,44,43,43,37,36,43,34,25,24,28,
  20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,128,3,3,414,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,129,128,129,
  58,34,131,38,113,201,49,48,47,46,48,48,45,44,43,43,37,36,43,34,25,24,28,
  20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,130,3,3,413,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,131,128,129,
  58,34,131,38,113,202,49,48,47,46,48,48,45,44,43,43,37,36,43,34,25,24,28,
  20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,132,3,3,412,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,133,128,129,
  58,34,131,38,113,203,49,48,47,46,48,48,45,44,43,43,37,36,43,34,25,24,28,
  20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,134,3,3,411,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,135,128,129,
  58,34,131,38,113,204,50,49,48,47,46,48,48,45,44,43,43,37,36,43,34,25,24,
  28,20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,136,3,3,410,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,137,128,129,
  58,34,131,38,113,205,50,49,48,47,46,48,48,45,44,43,43,37,36,43,34,25,24,
  28,20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,138,3,3,409,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,139,128,129,
  58,34,131,38,113,206,51,50,49,48,47,46,48,48,45,44,43,43,37,36,43,34,25,
  24,28,20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,140,3,3,408,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,141,128,129,
  58,34,131,38,113,207,52,51,50,49,48,47,46,48,48,45,44,43,43,37,36,43,34,
  25,24,28,20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,142,3,3,407,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,143,128,129,
  58,34,131,38,113,208,53,52,51,50,49,48,47,46,48,48,45,44,43,43,37,36,43,
  34,25,24,28,20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,144,3,3,406,
79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,145,209,
32,33,39,40,41,42,35,124,143,143,163,22,19,173,173,169,163,21,143,146,128,
  129,58,34,131,38,126,126,60,59,57,55,54,53,52,51,50,49,48,47,46,48,48,
  45,44,43,43,37,36,43,211,210,34,25,24,28,20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,147,3,3,405,
76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,148,212,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,149,3,3,404,
72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,150,213,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,151,3,3,402,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,152,128,129,
  58,34,131,38,70,70,60,59,57,55,54,53,52,51,50,49,48,47,46,48,48,45,44,
  43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,153,3,3,401,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,154,128,129,
  58,34,131,38,69,69,60,59,57,55,54,53,52,51,50,49,48,47,46,48,48,45,44,
  43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,155,3,3,400,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,156,128,129,
  58,34,131,38,68,68,60,59,57,55,54,53,52,51,50,49,48,47,46,48,48,45,44,
  43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,157,3,3,399,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,158,128,129,
  58,34,131,38,67,67,60,59,57,55,54,53,52,51,50,49,48,47,46,48,48,45,44,
  43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,159,3,3,398,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,160,128,129,
  58,34,131,38,66,66,60,59,57,55,54,53,52,51,50,49,48,47,46,48,48,45,44,
  43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,161,3,3,397,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,162,128,129,
  58,34,131,38,65,65,60,59,57,55,54,53,52,51,50,49,48,47,46,48,48,45,44,
  43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,163,3,3,396,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,164,128,129,
  58,34,131,38,64,64,60,59,57,55,54,53,52,51,50,49,48,47,46,48,48,45,44,
  43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,165,3,3,395,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,166,128,129,
  58,34,131,38,63,63,60,59,57,55,54,53,52,51,50,49,48,47,46,48,48,45,44,
  43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,167,3,3,394,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,168,128,129,
  58,34,131,38,62,62,60,59,57,55,54,53,52,51,50,49,48,47,46,48,48,45,44,
  43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,169,3,3,393,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,170,128,129,
  58,34,131,38,61,61,60,59,57,55,54,53,52,51,50,49,48,47,46,48,48,45,44,
  43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,171,3,3,392,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,172,128,129,
  58,34,131,38,60,60,60,59,57,55,54,53,52,51,50,49,48,47,46,48,48,45,44,
  43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,173,3,3,391,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,174,128,129,
  58,34,131,38,59,59,60,59,57,55,54,53,52,51,50,49,48,47,46,48,48,45,44,
  43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,175,3,3,388,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,176,128,129,
  58,34,131,38,57,57,60,59,57,55,54,53,52,51,50,49,48,47,46,48,48,45,44,
  43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
  365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
  365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,1,2,
  365,177,3,3,372,
35,178,214,
32,33,39,40,41,42,64,65,66,67,215,79,35,63,68,69,73,74,75,77,143,143,163,22,
  19,173,173,169,163,21,143,179,128,129,58,34,131,12,12,12,88,12,19,20,86,
  12,85,12,84,83,82,81,80,12,19,20,78,78,38,87,76,44,72,71,85,70,85,60,59,
  57,55,54,53,52,51,50,49,48,47,46,48,48,45,44,43,43,37,36,43,34,25,24,28,
  20,27,26,173,56,31,30,29,23,
32,33,39,40,41,42,35,54,143,143,163,22,19,173,173,169,163,21,143,180,128,
  129,58,34,131,216,61,38,61,61,60,59,57,55,54,53,52,51,50,49,48,47,46,48,
  48,45,44,43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,181,128,129,
  58,34,131,38,48,48,60,59,57,55,54,53,52,51,50,49,48,47,46,48,48,45,44,
  43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
143,143,143,182,46,56,
77,183,27,
175,40,176,
77,185,217,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,186,128,129,
  58,34,131,218,38,218,218,60,59,57,55,54,53,52,51,50,49,48,47,46,48,48,
  45,44,43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
219,14,220,43,
35,188,3,90,
175,177,189,37,176,
175,77,190,36,221,
32,33,39,40,41,42,64,65,66,67,79,35,63,68,69,73,74,75,77,143,143,163,22,19,
  173,173,169,163,21,143,1,191,128,129,58,34,131,12,12,12,88,12,19,20,86,
  12,85,12,84,83,82,81,80,12,19,20,78,78,38,87,76,72,71,85,70,85,60,59,57,
  55,54,53,52,51,50,49,48,47,46,48,48,45,44,43,43,37,36,43,34,25,24,28,20,
  27,26,173,56,31,30,29,23,
165,165,165,192,222,
165,165,165,193,223,
32,33,35,143,143,163,22,19,173,173,169,163,21,143,194,128,129,58,34,131,38,
  113,121,121,37,36,121,34,25,24,28,20,27,26,173,56,31,30,29,23,
32,33,35,143,143,163,22,19,173,173,169,163,21,143,195,128,129,58,34,131,38,
  113,120,120,37,36,120,34,25,24,28,20,27,26,173,56,31,30,29,23,
114,116,118,100,119,117,115,
114,116,118,99,119,117,115,
41,42,97,121,120,
41,42,96,121,120,
122,124,94,125,123,
122,124,93,125,123,
122,124,92,125,123,
122,124,91,125,123,
126,128,130,132,89,133,131,129,127,
126,128,130,132,88,133,131,129,127,
134,136,86,137,135,
138,84,139,
140,82,141,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,209,128,129,
  58,34,131,38,113,224,54,53,52,51,50,49,48,47,46,48,48,45,44,43,43,37,36,
  43,34,25,24,28,20,27,26,173,56,31,30,29,23,
175,125,225,
177,211,123,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,212,128,129,
  58,34,131,38,113,226,55,54,53,52,51,50,49,48,47,46,48,48,45,44,43,43,37,
  36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,213,128,129,
  58,34,131,227,38,227,227,60,59,57,55,54,53,52,51,50,49,48,47,46,48,48,
  45,44,43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
143,143,143,214,52,228,56,
365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
  365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,1,2,365,215,3,3,
  384,
77,216,38,
32,33,39,40,41,42,35,39,143,143,163,22,19,173,173,169,163,21,143,217,128,
  129,58,34,131,229,184,38,41,184,184,60,59,57,55,54,53,52,51,50,49,48,47,
  46,48,48,45,44,43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
175,177,218,42,176,
365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
  365,365,365,3,365,365,365,365,365,365,365,365,3,1,2,219,3,3,383,
32,33,39,40,41,42,64,65,66,67,79,35,63,68,69,73,74,75,77,143,143,163,22,19,
  173,173,169,163,21,143,220,128,129,58,34,131,16,17,88,17,19,20,86,17,85,
  17,84,83,82,81,80,17,19,20,78,78,38,87,76,72,71,85,70,85,60,59,57,55,54,
  53,52,51,50,49,48,47,46,48,48,45,44,43,43,37,36,43,34,25,24,28,20,27,26,
  173,56,31,30,29,23,
143,143,143,221,53,56,
166,166,166,157,166,
166,166,166,156,166,
142,80,143,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,225,128,129,
  58,34,131,38,127,127,60,59,57,55,54,53,52,51,50,49,48,47,46,48,48,45,44,
  43,43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
144,77,145,
230,175,227,176,231,
175,177,228,232,221,
177,229,21,
365,365,365,365,365,365,365,365,365,365,3,365,365,365,365,365,365,365,365,3,
  1,2,230,3,3,403,
73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,231,233,
49,232,234,
32,33,39,40,41,42,35,143,143,163,22,19,173,173,169,163,21,143,233,128,129,
  58,34,131,38,74,113,59,57,55,54,53,52,51,50,49,48,47,46,48,48,45,44,43,
  43,37,36,43,34,25,24,28,20,27,26,173,56,31,30,29,23,
67,234,235,
236,236,236,236,236,236,236,236,236,236,35,236,236,92,236,236,236,236,236,
  236,236,236,236,236,236,236,236,236,236,236,236,236,235,236,93,237,
238,238,238,238,238,238,238,238,238,238,11,238,238,238,238,238,238,238,238,
  238,238,238,238,238,238,238,238,238,238,238,238,236,238,
215,237,50,
32,33,39,40,41,42,64,65,66,67,79,35,63,68,69,73,74,75,77,143,143,163,22,19,
  173,173,169,163,21,143,51,128,129,58,34,131,12,12,12,88,12,19,20,86,12,
  85,12,84,83,82,81,80,12,19,20,78,78,38,87,76,72,71,85,70,85,60,59,57,55,
  54,53,52,51,50,49,48,47,46,48,48,45,44,43,43,37,36,43,34,25,24,28,20,27,
  26,173,56,31,30,29,23,

};


static const unsigned short ag_sbt[] = {
     0,  13,  50,  88,  94, 111, 145, 147, 182, 184, 212, 250, 288, 297,
   337, 403, 503, 603, 607, 642, 689, 694, 700, 753, 786, 789, 791, 798,
   832, 867, 899, 931, 963, 998,1033,1037,1067,1074,1081,1148,1174,1200,
  1226,1252,1255,1305,1355,1405,1455,1462,1467,1472,1481,1486,1489,1492,
  1495,1548,1551,1554,1559,1588,1591,1596,1605,1616,1642,1653,1693,1734,
  1775,1781,1843,1849,1876,1885,1894,1927,1969,1972,1981,1986,1991,2056,
  2059,2062,2067,2133,2136,2236,2240,2303,2403,2414,2421,2454,2508,2514,
  2517,2524,2527,2530,2537,2539,2545,2553,2561,2570,2573,2582,2585,2590,
  2616,2666,2671,2697,2747,2773,2823,2849,2899,2950,3001,3027,3079,3105,
  3157,3183,3236,3262,3315,3341,3394,3420,3473,3499,3553,3579,3633,3659,
  3714,3740,3796,3822,3879,3905,3925,3990,4016,4036,4062,4082,4108,4170,
  4196,4258,4284,4346,4372,4434,4460,4522,4548,4610,4636,4698,4724,4786,
  4812,4874,4900,4962,4988,5050,5076,5138,5164,5226,5288,5291,5393,5458,
  5520,5526,5529,5532,5535,5598,5602,5606,5611,5616,5717,5722,5727,5767,
  5807,5814,5821,5826,5831,5836,5841,5846,5851,5860,5869,5874,5877,5880,
  5938,5941,5944,6003,6066,6073,6114,6117,6183,6188,6226,6325,6331,6336,
  6341,6344,6406,6409,6414,6419,6422,6448,6468,6471,6532,6535,6571,6604,
  6607,6707
};


static const unsigned short ag_sbe[] = {
     9,  47,  85,  92,  99, 144, 146, 181, 183, 208, 246, 284, 293, 333,
   357, 433, 533, 604, 639, 687, 692, 697, 744, 782, 788, 790, 796, 831,
   865, 895, 927, 959, 994,1029,1034,1063,1070,1077,1101,1170,1196,1222,
  1248,1253,1273,1323,1373,1423,1458,1464,1469,1476,1483,1487,1490,1493,
  1544,1549,1552,1556,1573,1589,1593,1601,1612,1638,1649,1689,1730,1771,
  1778,1799,1846,1872,1881,1890,1925,1965,1970,1977,1983,1988,2010,2057,
  2060,2064,2086,2134,2166,2237,2258,2333,2410,2417,2452,2499,2511,2516,
  2522,2526,2529,2535,2538,2542,2550,2558,2566,2571,2578,2583,2587,2612,
  2634,2668,2693,2715,2769,2791,2845,2867,2917,2968,3023,3045,3101,3123,
  3179,3201,3258,3280,3337,3359,3416,3438,3495,3517,3575,3597,3655,3677,
  3736,3758,3818,3840,3901,3923,3944,4012,4034,4058,4080,4104,4126,4192,
  4214,4280,4302,4368,4390,4456,4478,4544,4566,4632,4654,4720,4742,4808,
  4830,4896,4918,4984,5006,5072,5094,5160,5182,5284,5289,5322,5412,5476,
  5523,5527,5530,5533,5553,5599,5603,5608,5613,5647,5720,5725,5741,5781,
  5810,5817,5823,5828,5833,5838,5843,5848,5855,5864,5871,5875,5878,5898,
  5939,5942,5962,6021,6069,6110,6115,6136,6185,6222,6256,6328,6334,6339,
  6342,6362,6407,6411,6416,6420,6444,6466,6469,6489,6533,6567,6602,6605,
  6637,6707
};


static const unsigned char ag_fl[] = {
  2,4,3,4,2,3,1,1,1,1,1,0,2,1,1,2,4,4,1,1,1,5,2,1,1,2,2,3,2,2,1,1,1,1,1,
  0,3,3,4,0,1,1,4,1,3,2,3,2,3,0,9,2,1,3,0,1,1,3,1,3,3,3,3,3,3,3,3,3,3,3,
  3,1,0,0,7,1,0,4,1,0,4,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,2,2,2,2,1,3,3,1,1,2,2,2,2,1,4,4,1,4,0,1,1,3,1,1,1,1,1,1,2,0,1,3,1,2,
  0,1,3,1,2,1,3,3,3,2,2,1,1,1,0,1,2,2,1,2,1,1,1,1,2,1,2,2,2,1,2,1,1,1,2,
  1,1,1,2,3,0,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,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,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,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,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
  2,2,2,2,2,2,2,2,2,2,2,2,2,2
};

static const unsigned short ag_ptt[] = {
    0, 12, 12, 12, 12, 12,198,199,200,201,202, 14, 14, 17, 17, 26, 26, 27,
   27, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 32, 47, 18, 13,
   13, 16, 33, 52, 52, 34, 28, 29, 38, 42, 42, 43, 43, 62, 44, 63, 50, 50,
   19, 19, 37, 37, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 64,
   80, 82, 64, 78, 85, 78, 83, 88, 83, 86, 86, 89, 89, 91, 91, 93, 93, 93,
   95, 95, 95, 95, 95, 98, 98, 98,103,103,103,106,106,106,106,109,109,109,
  109,109,113,113,116,116,116,116,116,116,116,116,116,116, 65,121,124,124,
  125,125,118,118,118,118,  1,130,130,131,131,  1,135,135,136,136,  1,217,
  217,262,262,262,140,140,140,143,143,143,149,149,142,142,145,145,261,261,
  261,146,146,150,150,147,147,148,148,160,160,152,152,161,161,126,126,264,
  164,164,165,165,167,167,167,168,168,168,168,168,168,168,168,168,168,168,
  169,169,169,182,183,184,170,170,187,187,263,189,189,151, 20, 20,127,127,
  129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,
  129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,134,134,
  134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,
  134,134,134,134,134,134,134,134,134,134,134,134,134,138,138,138,139,139,
  139,139,139,139,153,153,154,154,154,157,157,162,162,166,166,166,166,166,
  166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
  166,166,166,166,166,166,166,166,190,190,190,190,190,190,190,190,190,190,
  190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
  190,190,190,196,196,197,197,  7,  8,  9, 10, 11, 36, 35, 39, 40, 41, 45,
   46, 48, 49, 51, 53, 54, 56, 55,  4, 57, 58, 59, 61, 66, 67, 68, 69, 70,
   71, 72, 73, 74, 75, 76, 77, 81, 79, 84, 87, 90, 92, 94, 96, 97, 99,100,
  101,102,104,105,107,108,110,111,112,114,115,117,119,120,122,123,  2,  3,
    6,  5
};


static void ag_ra(PCB_DECL)
{
  switch(ag_rpx[(PCB).ag_ap]) {
    case 1: VNO AG_WRAP_5(ag_rp_1(PCB_POINTER)); break;
    case 2: VNO AG_WRAP_5(ag_rp_5(PCB_POINTER, VW(1, AG_WRAP_5 *))); 
            VWD(1, AG_WRAP_5 *); break;
    case 3: ag_rp_6(PCB_POINTER); break;
    case 4: ag_rp_7(PCB_POINTER); break;
    case 5: ag_rp_8(PCB_POINTER); break;
    case 6: ag_rp_9(PCB_POINTER); break;
    case 7: ag_rp_10(PCB_POINTER); break;
    case 8: ag_rp_11(PCB_POINTER); break;
    case 9: ag_rp_12(PCB_POINTER); break;
    case 10: ag_rp_13(PCB_POINTER); break;
    case 11: ag_rp_14(PCB_POINTER); break;
    case 12: ag_rp_15(PCB_POINTER); break;
    case 13: ag_rp_16(PCB_POINTER, V(1,(FileLocation *)), V(3,(FileLocation *))); break;
    case 14: VWD(0,AG_WRAP_5 *); break;
    case 15: ag_rp_17(PCB_POINTER); break;
    case 16: ag_rp_18(PCB_POINTER); break;
    case 17: ag_rp_19(PCB_POINTER, VW(1, AG_WRAP_5 *)); 
            VWD(1, AG_WRAP_5 *); break;
    case 18: ag_rp_20(PCB_POINTER); break;
    case 19: ag_rp_21(PCB_POINTER, VW(1, AG_WRAP_7 *)); 
            VWD(1, AG_WRAP_7 *); break;
    case 20: ag_rp_22(PCB_POINTER, VW(1, AG_WRAP_5 *)); 
            VWD(1, AG_WRAP_5 *); break;
    case 21: ag_rp_23(PCB_POINTER); break;
    case 22: V(0,(FileLocation *)) = ag_rp_24(PCB_POINTER); break;
    case 23: ag_rp_25(PCB_POINTER, VW(2, AG_WRAP_5 *)); 
            VWD(2, AG_WRAP_5 *); break;
    case 24: ag_rp_26(PCB_POINTER); break;
    case 25: ag_rp_27(PCB_POINTER, VW(1, AG_WRAP_4 *)); 
            VWD(1, AG_WRAP_4 *); break;
    case 26: ag_rp_28(PCB_POINTER, VW(2, AG_WRAP_4 *)); 
            VWD(2, AG_WRAP_4 *); break;
    case 27: ag_rp_29(PCB_POINTER, VW(1, AG_WRAP_5 *)); 
            VWD(1, AG_WRAP_5 *); break;
    case 28: ag_rp_30(PCB_POINTER, VW(2, AG_WRAP_5 *)); 
            VWD(2, AG_WRAP_5 *); break;
    case 29: ag_rp_31(PCB_POINTER, VW(-4, AG_WRAP_4 *), VW(-2, AG_WRAP_7 *)); break;
    case 30: ag_rp_32(PCB_POINTER, VW(1, AG_WRAP_4 *), VW(3, AG_WRAP_7 *), VW(7, AG_WRAP_4 *)); 
            VWD(1, AG_WRAP_4 *); VWD(3, AG_WRAP_7 *); VWD(7, AG_WRAP_4 *); break;
    case 31: VNO AG_WRAP_4(ag_rp_33(PCB_POINTER)); break;
    case 32: VRO(AG_WRAP_4 *, ag_rp_34(PCB_POINTER, VW(0, AG_WRAP_4 *))); break;
    case 33: VRO(AG_WRAP_7 *, ag_rp_35(PCB_POINTER, VW(0, AG_WRAP_7 *), VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 34: VNO AG_WRAP_5(ag_rp_36(PCB_POINTER)); break;
    case 35: VRO(AG_WRAP_5 *, ag_rp_37(PCB_POINTER, VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 36: VRO(AG_WRAP_5 *, ag_rp_38(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 37: VRO(AG_WRAP_5 *, ag_rp_39(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 38: VRO(AG_WRAP_5 *, ag_rp_40(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 39: VRO(AG_WRAP_5 *, ag_rp_41(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 40: VRO(AG_WRAP_5 *, ag_rp_42(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 41: VRO(AG_WRAP_5 *, ag_rp_43(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 42: VRO(AG_WRAP_5 *, ag_rp_44(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 43: VRO(AG_WRAP_5 *, ag_rp_45(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 44: VRO(AG_WRAP_5 *, ag_rp_46(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 45: VRO(AG_WRAP_5 *, ag_rp_47(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 46: VRO(AG_WRAP_5 *, ag_rp_48(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 47: VRO(AG_WRAP_5 *, ag_rp_49(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 48: ag_rp_50(PCB_POINTER, VW(-2, AG_WRAP_5 *)); break;
    case 49: ag_rp_51(PCB_POINTER, VW(-5, AG_WRAP_5 *), VW(-2, AG_WRAP_5 *)); break;
    case 50: VRO(AG_WRAP_5 *, ag_rp_52(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(3, AG_WRAP_5 *), VW(6, AG_WRAP_5 *))); 
            VWD(3, AG_WRAP_5 *); VWD(6, AG_WRAP_5 *); break;
    case 51: ag_rp_53(PCB_POINTER, VW(-2, AG_WRAP_5 *)); break;
    case 52: VRO(AG_WRAP_5 *, ag_rp_54(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(3, AG_WRAP_5 *))); 
            VWD(3, AG_WRAP_5 *); break;
    case 53: ag_rp_55(PCB_POINTER, VW(-2, AG_WRAP_5 *)); break;
    case 54: VRO(AG_WRAP_5 *, ag_rp_56(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(3, AG_WRAP_5 *))); 
            VWD(3, AG_WRAP_5 *); break;
    case 55: VRO(AG_WRAP_5 *, ag_rp_57(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 56: VRO(AG_WRAP_5 *, ag_rp_58(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 57: VRO(AG_WRAP_5 *, ag_rp_59(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 58: VRO(AG_WRAP_5 *, ag_rp_60(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 59: VRO(AG_WRAP_5 *, ag_rp_61(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 60: VRO(AG_WRAP_5 *, ag_rp_62(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 61: VRO(AG_WRAP_5 *, ag_rp_63(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 62: VRO(AG_WRAP_5 *, ag_rp_64(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 63: VRO(AG_WRAP_5 *, ag_rp_65(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 64: VRO(AG_WRAP_5 *, ag_rp_66(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 65: VRO(AG_WRAP_5 *, ag_rp_67(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 66: VRO(AG_WRAP_5 *, ag_rp_68(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 67: VRO(AG_WRAP_5 *, ag_rp_69(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 68: VRO(AG_WRAP_5 *, ag_rp_70(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 69: VRO(AG_WRAP_5 *, ag_rp_71(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 70: VRO(AG_WRAP_5 *, ag_rp_72(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 71: VNO AG_WRAP_5(ag_rp_73(PCB_POINTER, VW(1, AG_WRAP_5 *))); 
            VWD(1, AG_WRAP_5 *); break;
    case 72: VNO AG_WRAP_5(ag_rp_74(PCB_POINTER, VW(1, AG_WRAP_5 *))); 
            VWD(1, AG_WRAP_5 *); break;
    case 73: VNO AG_WRAP_5(ag_rp_75(PCB_POINTER, VW(1, AG_WRAP_5 *))); 
            VWD(1, AG_WRAP_5 *); break;
    case 74: VNO AG_WRAP_5(ag_rp_76(PCB_POINTER, VW(1, AG_WRAP_5 *))); 
            VWD(1, AG_WRAP_5 *); break;
    case 75: VRO(AG_WRAP_5 *, ag_rp_77(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 76: VNO AG_WRAP_5(ag_rp_78(PCB_POINTER, VW(1, AG_WRAP_5 *))); 
            VWD(1, AG_WRAP_5 *); break;
    case 77: VRO(AG_WRAP_5 *, ag_rp_79(PCB_POINTER, VW(0, AG_WRAP_5 *))); break;
    case 78: VNO AG_WRAP_5(ag_rp_80(PCB_POINTER, VW(1, AG_WRAP_5 *))); 
            VWD(1, AG_WRAP_5 *); break;
    case 79: VNO AG_WRAP_5(ag_rp_81(PCB_POINTER, VW(1, AG_WRAP_5 *))); 
            VWD(1, AG_WRAP_5 *); break;
    case 80: VRO(AG_WRAP_5 *, ag_rp_82(PCB_POINTER, VW(0, AG_WRAP_5 *))); break;
    case 81: VRO(AG_WRAP_5 *, ag_rp_83(PCB_POINTER, VW(0, AG_WRAP_5 *))); break;
    case 82: VNO AG_WRAP_5(ag_rp_84(PCB_POINTER, VW(3, AG_WRAP_5 *))); 
            VWD(3, AG_WRAP_5 *); break;
    case 83: VNO AG_WRAP_5(ag_rp_85(PCB_POINTER, VW(3, AG_WRAP_5 *))); 
            VWD(3, AG_WRAP_5 *); break;
    case 84: VRO(AG_WRAP_4 *, ag_rp_86(PCB_POINTER, VW(0, AG_WRAP_4 *))); break;
    case 85: VRO(AG_WRAP_4 *, ag_rp_87(PCB_POINTER, VW(0, AG_WRAP_4 *), VW(2, AG_WRAP_6 *))); 
            VWD(2, AG_WRAP_6 *); break;
    case 86: VNO AG_WRAP_6(ag_rp_88(PCB_POINTER)); break;
    case 87: VRO(AG_WRAP_5 *, ag_rp_89(PCB_POINTER, VW(0, AG_WRAP_5 *))); break;
    case 88: VRO(AG_WRAP_6 *, ag_rp_90(PCB_POINTER, VW(0, AG_WRAP_6 *), VW(2, AG_WRAP_5 *))); 
            VWD(2, AG_WRAP_5 *); break;
    case 89: VNO AG_WRAP_5(ag_rp_91(PCB_POINTER, V(0,(long *)))); break;
    case 90: VNO AG_WRAP_5(ag_rp_92(PCB_POINTER, V(0,(double *)))); break;
    case 91: VNO AG_WRAP_5(ag_rp_93(PCB_POINTER, V(0,(int *)))); break;
    case 92: VNO AG_WRAP_4(ag_rp_94(PCB_POINTER, V(0,(int *)))); break;
    case 93: VRO(AG_WRAP_4 *, ag_rp_95(PCB_POINTER, VW(0, AG_WRAP_4 *), V(1,(int *)))); break;
    case 94: V(0,(double *)) = ag_rp_96(PCB_POINTER, V(0,(double *)), V(2,(long *))); break;
    case 95: V(0,(double *)) = ag_rp_97(PCB_POINTER, V(0,(double *)), V(2,(long *))); break;
    case 96: V(0,(double *)) = ag_rp_98(PCB_POINTER, V(0,(double *)), V(2,(double *))); break;
    case 97: V(0,(double *)) = ag_rp_99(PCB_POINTER, V(0,(double *))); break;
    case 98: V(0,(double *)) = ag_rp_100(PCB_POINTER, V(1,(double *))); break;
    case 99: V(0,(double *)) = ag_rp_101(PCB_POINTER, V(0,(long *))); break;
    case 100: V(0,(double *)) = ag_rp_102(PCB_POINTER, V(0,(long *))); break;
    case 101: V(0,(double *)) = ag_rp_103(PCB_POINTER, V(0,(long *))); break;
    case 102: V(0,(long *)) = ag_rp_104(PCB_POINTER, V(1,(long *))); break;
    case 103: V(0,(long *)) = ag_rp_105(PCB_POINTER, V(1,(long *))); break;
    case 104: V(0,(double *)) = ag_rp_106(PCB_POINTER, V(0,(int *))); break;
    case 105: V(0,(double *)) = ag_rp_107(PCB_POINTER, V(0,(int *)), V(1,(double *))); break;
    case 106: V(0,(long *)) = ag_rp_108(PCB_POINTER, V(0,(int *))); break;
    case 107: V(0,(long *)) = ag_rp_109(PCB_POINTER, V(0,(long *)), V(1,(int *))); break;
    case 108: V(0,(long *)) = ag_rp_110(PCB_POINTER, V(0,(int *))); break;
    case 109: V(0,(long *)) = ag_rp_111(PCB_POINTER, V(0,(long *)), V(1,(int *))); break;
    case 110: V(0,(long *)) = ag_rp_112(PCB_POINTER, V(0,(long *)), V(1,(int *))); break;
    case 111: V(0,(long *)) = ag_rp_113(PCB_POINTER, V(0,(long *)), V(1,(int *))); break;
    case 112: V(0,(long *)) = ag_rp_114(PCB_POINTER); break;
    case 113: V(0,(long *)) = ag_rp_115(PCB_POINTER, V(0,(long *)), V(1,(int *))); break;
    case 114: V(0,(long *)) = ag_rp_116(PCB_POINTER); break;
    case 115: V(0,(long *)) = ag_rp_117(PCB_POINTER, V(0,(long *)), V(1,(int *))); break;
    case 116: V(0,(int *)) = ag_rp_118(PCB_POINTER, V(0,(int *))); break;
    case 117: V(0,(int *)) = ag_rp_119(PCB_POINTER, V(0,(int *))); break;
    case 118: VRO(AG_WRAP_5 *, ag_rp_120(PCB_POINTER, VW(0, AG_WRAP_5 *), VW(1, AG_WRAP_5 *))); 
            VWD(1, AG_WRAP_5 *); break;
    case 119: VNO AG_WRAP_5(ag_rp_121(PCB_POINTER, VW(1, AG_WRAP_4 *))); 
            VWD(1, AG_WRAP_4 *); break;
    case 120: VNO AG_WRAP_4(ag_rp_122(PCB_POINTER)); break;
    case 121: VRO(AG_WRAP_4 *, ag_rp_123(PCB_POINTER, VW(0, AG_WRAP_4 *), V(1,(int *)))); break;
    case 122: V(0,(int *)) = ag_rp_124(PCB_POINTER); break;
    case 123: V(0,(int *)) = ag_rp_125(PCB_POINTER); break;
    case 124: V(0,(int *)) = ag_rp_126(PCB_POINTER); break;
    case 125: V(0,(int *)) = ag_rp_127(PCB_POINTER); break;
    case 126: V(0,(int *)) = ag_rp_128(PCB_POINTER); break;
    case 127: V(0,(int *)) = ag_rp_129(PCB_POINTER); break;
    case 128: V(0,(int *)) = ag_rp_130(PCB_POINTER); break;
    case 129: V(0,(int *)) = ag_rp_131(PCB_POINTER); break;
    case 130: V(0,(int *)) = ag_rp_132(PCB_POINTER); break;
    case 131: V(0,(int *)) = ag_rp_133(PCB_POINTER); break;
    case 132: V(0,(int *)) = ag_rp_134(PCB_POINTER); break;
    case 133: V(0,(int *)) = ag_rp_135(PCB_POINTER, V(1,(int *))); break;
    case 134: V(0,(int *)) = ag_rp_136(PCB_POINTER, V(0,(int *)), V(1,(int *))); break;
    case 135: V(0,(int *)) = ag_rp_137(PCB_POINTER, V(0,(int *)), V(1,(int *))); break;
    case 136: V(0,(int *)) = ag_rp_138(PCB_POINTER, V(1,(int *))); break;
    case 137: V(0,(int *)) = ag_rp_139(PCB_POINTER, V(0,(int *)), V(1,(int *))); break;
    case 138: V(0,(int *)) = ag_rp_140(PCB_POINTER, V(0,(int *))); break;
    case 139: V(0,(int *)) = ag_rp_141(PCB_POINTER, V(0,(int *))); break;
    case 140: V(0,(int *)) = ag_rp_142(PCB_POINTER, V(1,(int *))); break;
  }
  (PCB).la_ptr = (PCB).pointer;
}

#define TOKEN_NAMES dxi_token_names
const char *const dxi_token_names[265] = {
  "syntax selection",
  "white space",
  "integer",
  "real",
  "name",
  "string element",
  "character constant",
  "SCRIPT",
  "WHILE LOOP",
  "DO LOOP",
  "STATEMENT",
  "FOR FIELD",
  "syntax selection",
  "local statement",
  "statement list",
  "eof",
  "loop condition",
  "statement",
  "DO WHILE",
  "optional expression",
  "",
  "\"script\"",
  "\"whileLoop\"",
  "\"doLoop\"",
  "\"statement\"",
  "\"forField\"",
  "open statement",
  "closed statement",
  "if condition",
  "else",
  "simple statement",
  "DO",
  "WHILE",
  "for initialization",
  "for field",
  "';'",
  "')'",
  "expression",
  "compound statement",
  "\"break\"",
  "\"continue\"",
  "\"return\"",
  "dump statement",
  "print statement",
  "function definition",
  "\"do\"",
  "\"while\"",
  "FOR",
  "\"for\"",
  "\"local\"",
  "name list",
  "'('",
  "",
  "\"if\"",
  "\"else\"",
  "'{'",
  "'}'",
  "\"dump\"",
  "','",
  "\"print\"",
  "assignment expression",
  "\"function\"",
  "",
  "function body",
  "conditional expression",
  "lvalue",
  "'='",
  "\"+=\"",
  "\"-=\"",
  "\"*=\"",
  "\"/=\"",
  "\"%=\"",
  "\"|=\"",
  "\"^=\"",
  "\"&=\"",
  "\"<<=\"",
  "\">>=\"",
  "\"**=\"",
  "logical or expression",
  "'\\?'",
  "",
  "':'",
  "",
  "logical and expression",
  "\"||\"",
  "",
  "inclusive or expression",
  "\"&&\"",
  "",
  "exclusive or expression",
  "'|'",
  "and expression",
  "'^'",
  "equality expression",
  "'&'",
  "relational expression",
  "\"==\"",
  "\"!=\"",
  "shift expression",
  "'<'",
  "\"<=\"",
  "'>'",
  "\">=\"",
  "additive expression",
  "\"<<\"",
  "\">>\"",
  "multiplicative expression",
  "'+'",
  "'-'",
  "unary expression",
  "'*'",
  "'/'",
  "'%'",
  "factor",
  "'!'",
  "'~'",
  "primary",
  "\"**\"",
  "constant",
  "\"++\"",
  "\"--\"",
  "function call",
  "\"long\"",
  "\"double\"",
  "optional arg list",
  "arg list",
  "string",
  "space",
  "\"/*\"",
  "",
  "",
  "",
  "\"*/\"",
  "\"//\"",
  "",
  "",
  "",
  "'\\n'",
  "letter",
  "",
  "simple real",
  "",
  "signed exponent",
  "integer part",
  "'.'",
  "fraction part",
  "decimal integer",
  "hybrid integer",
  "octal integer",
  "",
  "exponent",
  "digit",
  "hex integer",
  "",
  "",
  "",
  "'0'",
  "",
  "\"0x\"",
  "\"0X\"",
  "",
  "hex digit",
  "",
  "'\\\"'",
  "s char sequence",
  "s char",
  "",
  "escape sequence",
  "simple escape sequence",
  "octal escape sequence",
  "hexadecimal escape sequence",
  "\"\\\\\\'\"",
  "\"\\\\\\\"\"",
  "\"\\\\?\"",
  "\"\\\\\\\\\"",
  "\"\\\\a\"",
  "\"\\\\b\"",
  "\"\\\\f\"",
  "\"\\\\n\"",
  "\"\\\\r\"",
  "\"\\\\t\"",
  "\"\\\\v\"",
  "one octal",
  "two octal",
  "three octal",
  "'\\\\'",
  "\"\\\\x\"",
  "hexadecimal digit",
  "'\\''",
  "c char",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "SCRIPT",
  "WHILE LOOP",
  "DO LOOP",
  "STATEMENT",
  "FOR FIELD",
  "')'",
  "';'",
  "\"break\"",
  "\"continue\"",
  "\"return\"",
  "\"do\"",
  "\"while\"",
  "\"for\"",
  "\"local\"",
  "'('",
  "\"if\"",
  "\"else\"",
  "'}'",
  "'{'",
  "name",
  "\"dump\"",
  "','",
  "\"print\"",
  "\"function\"",
  "'='",
  "\"+=\"",
  "\"-=\"",
  "\"*=\"",
  "\"/=\"",
  "\"%=\"",
  "\"|=\"",
  "\"^=\"",
  "\"&=\"",
  "\"<<=\"",
  "\">>=\"",
  "\"**=\"",
  "':'",
  "'\\?'",
  "\"||\"",
  "\"&&\"",
  "'|'",
  "'^'",
  "'&'",
  "\"==\"",
  "\"!=\"",
  "'<'",
  "\"<=\"",
  "'>'",
  "\">=\"",
  "\"<<\"",
  "\">>\"",
  "'+'",
  "'-'",
  "'*'",
  "'/'",
  "'%'",
  "'!'",
  "'~'",
  "\"**\"",
  "\"++\"",
  "\"--\"",
  "\"long\"",
  "\"double\"",
  "integer",
  "real",
  "character constant",
  "string element",

};

#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(PCB_DECL) {
  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(INPUT_CODE((*(PCB).pointer))) && INPUT_CODE((*(PCB).pointer)) != '\\') {
    char buf[20];
    sprintf(buf, "\'%c\'", (char) INPUT_CODE((*(PCB).pointer)));
    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(PCB_DECL);
static int ag_action_2_r_proc(PCB_DECL);
static int ag_action_3_r_proc(PCB_DECL);
static int ag_action_4_r_proc(PCB_DECL);
static int ag_action_1_s_proc(PCB_DECL);
static int ag_action_3_s_proc(PCB_DECL);
static int ag_action_1_proc(PCB_DECL);
static int ag_action_2_proc(PCB_DECL);
static int ag_action_3_proc(PCB_DECL);
static int ag_action_4_proc(PCB_DECL);
static int ag_action_5_proc(PCB_DECL);
static int ag_action_6_proc(PCB_DECL);
static int ag_action_7_proc(PCB_DECL);
static int ag_action_8_proc(PCB_DECL);
static int ag_action_9_proc(PCB_DECL);
static int ag_action_10_proc(PCB_DECL);
static int ag_action_11_proc(PCB_DECL);
static int ag_action_8_proc(PCB_DECL);


static int (*const  ag_r_procs_scan[])(PCB_DECL) = {
  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[])(PCB_DECL) = {
  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[])(PCB_DECL) = {
  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(PCB_DECL) {
  int ag_t = (PCB).token_number;
  (PCB).btsx = 0, (PCB).drt = -1;
  do {
    ag_track(PCB_POINTER);
    (PCB).token_number = (dxi_token_type) AG_TCV(INPUT_CODE(*(PCB).la_ptr));
    (PCB).la_ptr++;
    if (ag_key_index[(PCB).sn]) {
      unsigned ag_k = ag_key_index[(PCB).sn];
      int ag_ch = CONVERT_CASE(INPUT_CODE(*(PCB).pointer));
      if (ag_ch <= 255) {
        while (ag_key_ch[ag_k] < ag_ch) ag_k++;
        if (ag_key_ch[ag_k] == ag_ch) ag_get_key_word((PCB_TYPE *)PCB_POINTER, ag_k);
      }
    }
  } while ((PCB).token_number == (dxi_token_type) ag_t);
  (PCB).la_ptr =  (PCB).pointer;
  return 1;
}

static int ag_action_11_proc(PCB_DECL) {
  int ag_t = (PCB).token_number;

  (PCB).btsx = 0, (PCB).drt = -1;
  do {
    (*(int *) &(PCB).vs[(PCB).ssx]) = *(PCB).pointer;
    (PCB).ssx--;
    ag_track(PCB_POINTER);
    ag_ra(PCB_POINTER);
    if ((PCB).exit_flag != AG_RUNNING_CODE) return 0;
    (PCB).ssx++;
    (PCB).token_number = (dxi_token_type) AG_TCV(INPUT_CODE(*(PCB).la_ptr));
    (PCB).la_ptr++;
    if (ag_key_index[(PCB).sn]) {
      unsigned ag_k = ag_key_index[(PCB).sn];
      int ag_ch = CONVERT_CASE(INPUT_CODE(*(PCB).pointer));
      if (ag_ch <= 255) {
        while (ag_key_ch[ag_k] < ag_ch) ag_k++;
        if (ag_key_ch[ag_k] == ag_ch) ag_get_key_word((PCB_TYPE *)PCB_POINTER, ag_k);
      }
    }
  }
  while ((PCB).token_number == (dxi_token_type) ag_t);
  (PCB).la_ptr =  (PCB).pointer;
  return 1;
}

static int ag_action_3_r_proc(PCB_DECL) {
  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 = (dxi_token_type) ag_ptt[(PCB).ag_ap];
  ag_ra(PCB_POINTER);
  return (PCB).exit_flag == AG_RUNNING_CODE;
}

static int ag_action_3_s_proc(PCB_DECL) {
  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 = (dxi_token_type) ag_ptt[(PCB).ag_ap];
  ag_ra(PCB_POINTER);
  return (PCB).exit_flag == AG_RUNNING_CODE;;
}

static int ag_action_4_r_proc(PCB_DECL) {
  int ag_sd = ag_fl[(PCB).ag_ap] - 1;
  if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
  (PCB).reduction_token = (dxi_token_type) ag_ptt[(PCB).ag_ap];
  return 1;
}

static int ag_action_2_proc(PCB_DECL) {
  (PCB).btsx = 0, (PCB).drt = -1;
  if ((PCB).ssx >= 128) {
    (PCB).exit_flag = AG_STACK_ERROR_CODE;
    PARSER_STACK_OVERFLOW;
  }
  (*(int *) &(PCB).vs[(PCB).ssx]) = *(PCB).pointer;
  GET_CONTEXT;
  (PCB).ss[(PCB).ssx] = (PCB).sn;
  (PCB).ssx++;
  (PCB).sn = (PCB).ag_ap;
  ag_track(PCB_POINTER);
  return 0;
}

static int ag_action_9_proc(PCB_DECL) {
  if ((PCB).drt == -1) {
    (PCB).drt=(PCB).token_number;
    (PCB).dssx=(PCB).ssx;
    (PCB).dsn=(PCB).sn;
  }
  ag_prot(PCB_POINTER);
  (PCB).vs[(PCB).ssx] = ag_null_value;
  GET_CONTEXT;
  (PCB).ss[(PCB).ssx] = (PCB).sn;
  (PCB).ssx++;
  (PCB).sn = (PCB).ag_ap;
  (PCB).la_ptr =  (PCB).pointer;
  return (PCB).exit_flag == AG_RUNNING_CODE;
}

static int ag_action_2_r_proc(PCB_DECL) {
  (PCB).ssx++;
  (PCB).sn = (PCB).ag_ap;
  return 0;
}

static int ag_action_7_proc(PCB_DECL) {
  --(PCB).ssx;
  (PCB).la_ptr =  (PCB).pointer;
  (PCB).exit_flag = AG_SUCCESS_CODE;
  return 0;
}

static int ag_action_1_proc(PCB_DECL) {
  ag_track(PCB_POINTER);
  (PCB).exit_flag = AG_SUCCESS_CODE;
  return 0;
}

static int ag_action_1_r_proc(PCB_DECL) {
  (PCB).exit_flag = AG_SUCCESS_CODE;
  return 0;
}

static int ag_action_1_s_proc(PCB_DECL) {
  (PCB).exit_flag = AG_SUCCESS_CODE;
  return 0;
}

static int ag_action_4_proc(PCB_DECL) {
  int ag_sd = ag_fl[(PCB).ag_ap] - 1;
  (PCB).reduction_token = (dxi_token_type) ag_ptt[(PCB).ag_ap];
  (PCB).btsx = 0, (PCB).drt = -1;
  (*(int *) &(PCB).vs[(PCB).ssx]) = *(PCB).pointer;
  if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
  else GET_CONTEXT;
  (PCB).ss[(PCB).ssx] = (PCB).sn;
  ag_track(PCB_POINTER);
  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 short)(PCB).reduction_token) ag_t1 = ag_tx + 1;
      else ag_t2 = ag_tx;
    } while (ag_t1 < ag_t2);
    (PCB).ag_ap = ag_pstt[ag_t1];
    if ((ag_s_procs_scan[ag_astt[ag_t1]])(PCB_POINTER) == 0) break;
  }
  return 0;
}

static int ag_action_3_proc(PCB_DECL) {
  int ag_sd = ag_fl[(PCB).ag_ap] - 1;
  (PCB).btsx = 0, (PCB).drt = -1;
  (*(int *) &(PCB).vs[(PCB).ssx]) = *(PCB).pointer;
  if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
  else GET_CONTEXT;
  (PCB).ss[(PCB).ssx] = (PCB).sn;
  ag_track(PCB_POINTER);
  (PCB).reduction_token = (dxi_token_type) ag_ptt[(PCB).ag_ap];
  ag_ra(PCB_POINTER);
  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 short)(PCB).reduction_token) ag_t1 = ag_tx + 1;
      else ag_t2 = ag_tx;
    } while (ag_t1 < ag_t2);
    (PCB).ag_ap = ag_pstt[ag_t1];
    if ((ag_s_procs_scan[ag_astt[ag_t1]])(PCB_POINTER) == 0) break;
  }
  return 0;
}

static int ag_action_8_proc(PCB_DECL) {
  ag_undo(PCB_POINTER);
  (PCB).la_ptr =  (PCB).pointer;
  (PCB).exit_flag = AG_SYNTAX_ERROR_CODE;
  ag_diagnose(PCB_POINTER);
  SYNTAX_ERROR;
  {(PCB).la_ptr = (PCB).pointer + 1; ag_track(PCB_POINTER);}
  return (PCB).exit_flag == AG_RUNNING_CODE;
}

static int ag_action_5_proc(PCB_DECL) {
  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 {
    GET_CONTEXT;
    (PCB).ss[(PCB).ssx] = (PCB).sn;
  }
  (PCB).la_ptr =  (PCB).pointer;
  (PCB).reduction_token = (dxi_token_type) ag_ptt[(PCB).ag_ap];
  ag_ra(PCB_POINTER);
  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 short)(PCB).reduction_token) ag_t1 = ag_tx + 1;
      else ag_t2 = ag_tx;
    } while (ag_t1 < ag_t2);
    (PCB).ag_ap = ag_pstt[ag_t1];
    if ((ag_r_procs_scan[ag_astt[ag_t1]])(PCB_POINTER) == 0) break;
  }
  return (PCB).exit_flag == AG_RUNNING_CODE;
}

static int ag_action_6_proc(PCB_DECL) {
  int ag_sd = ag_fl[(PCB).ag_ap];
  (PCB).reduction_token = (dxi_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_POINTER);
    (PCB).vs[(PCB).ssx] = ag_null_value;
    GET_CONTEXT;
    (PCB).ss[(PCB).ssx] = (PCB).sn;
  }
  (PCB).la_ptr =  (PCB).pointer;
  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 short)(PCB).reduction_token) ag_t1 = ag_tx + 1;
      else ag_t2 = ag_tx;
    } while (ag_t1 < ag_t2);
    (PCB).ag_ap = ag_pstt[ag_t1];
    if ((ag_r_procs_scan[ag_astt[ag_t1]])(PCB_POINTER) == 0) break;
  }
  return (PCB).exit_flag == AG_RUNNING_CODE;
}


void init_dxi(dxi_pcb_type *PCB_POINTER) {
  (PCB).la_ptr = (PCB).pointer;
  (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;
}

void dxi(dxi_pcb_type *PCB_POINTER) {
  init_dxi(PCB_POINTER);
  (PCB).exit_flag = AG_RUNNING_CODE;
  while ((PCB).exit_flag == AG_RUNNING_CODE) {
    unsigned ag_t1 = ag_sbt[(PCB).sn];
    if (ag_tstt[ag_t1]) {
      unsigned ag_t2 = ag_sbe[(PCB).sn] - 1;
      (PCB).token_number = (dxi_token_type) AG_TCV(INPUT_CODE(*(PCB).la_ptr));
      (PCB).la_ptr++;
      if (ag_key_index[(PCB).sn]) {
        unsigned ag_k = ag_key_index[(PCB).sn];
        int ag_ch = CONVERT_CASE(INPUT_CODE(*(PCB).pointer));
        if (ag_ch <= 255) {
          while (ag_key_ch[ag_k] < ag_ch) ag_k++;
          if (ag_key_ch[ag_k] == ag_ch) ag_get_key_word((PCB_TYPE *)PCB_POINTER, ag_k);
        }
      }
      do {
        unsigned ag_tx = (ag_t1 + ag_t2)/2;
        if (ag_tstt[ag_tx] > (unsigned short)(PCB).token_number)
          ag_t1 = ag_tx + 1;
        else ag_t2 = ag_tx;
      } while (ag_t1 < ag_t2);
      if (ag_tstt[ag_t1] != (unsigned short)(PCB).token_number)
        ag_t1 = ag_sbe[(PCB).sn];
    }
    (PCB).ag_ap = ag_pstt[ag_t1];
    (ag_gt_procs_scan[ag_astt[ag_t1]])((PCB_TYPE *)PCB_POINTER);
  }
}


