This is an automated email from the ASF dual-hosted git repository.

mboehm7 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/systemds.git


The following commit(s) were added to refs/heads/main by this push:
     new d916791cd0 [SYSTEMDS-3370] Fix missing support for list unnesting
d916791cd0 is described below

commit d916791cd0c96f9ae2356f39aa744d48dbc2c96c
Author: Matthias Boehm <[email protected]>
AuthorDate: Sun May 8 18:38:06 2022 +0200

    [SYSTEMDS-3370] Fix missing support for list unnesting
    
    This patch adds the missing parser, compiler, and runtime support of
    unnesting lists. List indexing always returns lists for consistency of
    range and point indexing and casts like as.matrix and as.frame are used
    to unnest matrices and frames out of one-element lists. For nested lists
    this support was still missing. For consistency with as.matrix and
    similar operations, this patch adds a new as.list which unnests
    list(list) to the inner list (can be called multiple times for deeper
    hierarchies).
---
 .../java/org/apache/sysds/common/Builtins.java     |   9 +-
 src/main/java/org/apache/sysds/common/Types.java   |   6 +-
 src/main/java/org/apache/sysds/hops/UnaryOp.java   |   8 +-
 src/main/java/org/apache/sysds/lops/UnaryCP.java   |   7 -
 .../sysds/parser/BuiltinFunctionExpression.java    |   8 +
 .../org/apache/sysds/parser/DMLTranslator.java     |   3 +
 src/main/java/org/apache/sysds/parser/dml/Dml.g4   |   3 +-
 .../org/apache/sysds/parser/dml/DmlLexer.interp    |   2 +-
 .../java/org/apache/sysds/parser/dml/DmlLexer.java | 432 +++++++++++----------
 .../runtime/instructions/CPInstructionParser.java  |  15 +-
 .../instructions/cp/VariableCPInstruction.java     |  36 +-
 .../instructions/fed/CastFEDInstruction.java       |   6 +-
 .../instructions/fed/FEDInstructionUtils.java      |   5 +-
 .../instructions/spark/CastSPInstruction.java      |   8 +-
 .../sysds/runtime/lineage/LineageItemUtils.java    |   4 +-
 .../test/functions/misc/ListAppendSizeTest.java    |   2 -
 .../LiteralReplaceCastScalarReadTest.java          |   8 +-
 .../scripts/functions/misc/ListAppendSize4.dml     |   7 +-
 18 files changed, 294 insertions(+), 275 deletions(-)

diff --git a/src/main/java/org/apache/sysds/common/Builtins.java 
b/src/main/java/org/apache/sysds/common/Builtins.java
index 3e02e706c8..84c104f99d 100644
--- a/src/main/java/org/apache/sysds/common/Builtins.java
+++ b/src/main/java/org/apache/sysds/common/Builtins.java
@@ -64,12 +64,13 @@ public enum Builtins {
        BITWSHIFTL("bitwShiftL", false),
        BITWSHIFTR("bitwShiftR", false),
        BIVAR("bivar", true),
-       CAST_AS_SCALAR("as.scalar", "castAsScalar", false),
-       CAST_AS_MATRIX("as.matrix", false),
-       CAST_AS_FRAME("as.frame", false),
+       CAST_AS_BOOLEAN("as.logical", "as.boolean", false),
        CAST_AS_DOUBLE("as.double", false),
+       CAST_AS_FRAME("as.frame", false),
        CAST_AS_INT("as.integer", false),
-       CAST_AS_BOOLEAN("as.logical", "as.boolean", false),
+       CAST_AS_LIST("as.list", false),
+       CAST_AS_MATRIX("as.matrix", false),
+       CAST_AS_SCALAR("as.scalar", "castAsScalar", false),
        CBIND("cbind", "append", false),
        CEIL("ceil", "ceiling", false),
        CHOLESKY("cholesky", false),
diff --git a/src/main/java/org/apache/sysds/common/Types.java 
b/src/main/java/org/apache/sysds/common/Types.java
index 71eb7f71e0..b6ef98abc7 100644
--- a/src/main/java/org/apache/sysds/common/Types.java
+++ b/src/main/java/org/apache/sysds/common/Types.java
@@ -232,8 +232,9 @@ public class Types
        
        // Operations that require 1 operand
        public enum OpOp1 {
-               ABS, ACOS, ASIN, ASSERT, ATAN, BROADCAST, CAST_AS_SCALAR, 
CAST_AS_MATRIX,
-               CAST_AS_FRAME, CAST_AS_DOUBLE, CAST_AS_INT, CAST_AS_BOOLEAN,
+               ABS, ACOS, ASIN, ASSERT, ATAN, BROADCAST,
+               CAST_AS_FRAME, CAST_AS_LIST, CAST_AS_MATRIX, CAST_AS_SCALAR,
+               CAST_AS_BOOLEAN, CAST_AS_DOUBLE, CAST_AS_INT,
                CEIL, CHOLESKY, COS, COSH, CUMMAX, CUMMIN, CUMPROD, CUMSUM,
                CUMSUMPROD, DETECTSCHEMA, COLNAMES, EIGEN, EXISTS, EXP, FLOOR, 
INVERSE,
                IQM, ISNA, ISNAN, ISINF, LENGTH, LINEAGE, LOG, NCOL, NOT, NROW,
@@ -266,6 +267,7 @@ public class Types
                                case CAST_AS_SCALAR:  return "castdts";
                                case CAST_AS_MATRIX:  return "castdtm";
                                case CAST_AS_FRAME:   return "castdtf";
+                               case CAST_AS_LIST:    return "castdtl";
                                case CAST_AS_DOUBLE:  return "castvtd";
                                case CAST_AS_INT:     return "castvti";
                                case CAST_AS_BOOLEAN: return "castvtb";
diff --git a/src/main/java/org/apache/sysds/hops/UnaryOp.java 
b/src/main/java/org/apache/sysds/hops/UnaryOp.java
index 25a1202c5f..57df31a958 100644
--- a/src/main/java/org/apache/sysds/hops/UnaryOp.java
+++ b/src/main/java/org/apache/sysds/hops/UnaryOp.java
@@ -444,6 +444,7 @@ public class UnaryOp extends MultiThreadedHop
                return (_op == OpOp1.CAST_AS_MATRIX
                        || _op == OpOp1.CAST_AS_SCALAR
                        || _op == OpOp1.CAST_AS_FRAME
+                       || _op == OpOp1.CAST_AS_LIST
                        || _op == OpOp1.CAST_AS_BOOLEAN
                        || _op == OpOp1.CAST_AS_DOUBLE
                        || _op == OpOp1.CAST_AS_INT);
@@ -464,7 +465,8 @@ public class UnaryOp extends MultiThreadedHop
                        || _op == OpOp1.NCOL
                        || _op == OpOp1.LENGTH
                        || _op == OpOp1.EXISTS
-                       || _op == OpOp1.LINEAGE;
+                       || _op == OpOp1.LINEAGE
+                       || _op == OpOp1.CAST_AS_LIST;
        }
        
        @Override
@@ -548,6 +550,10 @@ public class UnaryOp extends MultiThreadedHop
                        setDim1( 1 );
                        setDim2( 1 );
                }
+               else if( _op == OpOp1.CAST_AS_LIST ) {
+                       setDim1(-1);
+                       setDim2(1);
+               }
                else if ( _op==OpOp1.CUMSUMPROD ) {
                        setDim1(input.getDim1());
                        setDim2(1);
diff --git a/src/main/java/org/apache/sysds/lops/UnaryCP.java 
b/src/main/java/org/apache/sysds/lops/UnaryCP.java
index 3776885892..9c2a67f94b 100644
--- a/src/main/java/org/apache/sysds/lops/UnaryCP.java
+++ b/src/main/java/org/apache/sysds/lops/UnaryCP.java
@@ -28,13 +28,6 @@ import org.apache.sysds.common.Types.ValueType;
 
 public class UnaryCP extends Lop 
 {
-       public static final String CAST_AS_SCALAR_OPCODE = "castdts";
-       public static final String CAST_AS_MATRIX_OPCODE = "castdtm";
-       public static final String CAST_AS_FRAME_OPCODE = "castdtf";
-       public static final String CAST_AS_DOUBLE_OPCODE = "castvtd";
-       public static final String CAST_AS_INT_OPCODE    = "castvti";
-       public static final String CAST_AS_BOOLEAN_OPCODE = "castvtb";
-
        private OpOp1 operation;
 
        /**
diff --git 
a/src/main/java/org/apache/sysds/parser/BuiltinFunctionExpression.java 
b/src/main/java/org/apache/sysds/parser/BuiltinFunctionExpression.java
index 8bbc5be88d..0da5609afd 100644
--- a/src/main/java/org/apache/sysds/parser/BuiltinFunctionExpression.java
+++ b/src/main/java/org/apache/sysds/parser/BuiltinFunctionExpression.java
@@ -720,6 +720,14 @@ public class BuiltinFunctionExpression extends 
DataIdentifier
                        output.setBlocksize(id.getBlocksize());
                        output.setValueType(ValueType.FP64); //matrices always 
in double
                        break;
+               case CAST_AS_LIST: //list unnesting
+                       checkNumParameters(1);
+                       checkDataTypeParam(getFirstExpr(), DataType.LIST);
+                       output.setDataType(DataType.LIST);
+                       output.setDimensions(-1, 1);
+                       output.setBlocksize(id.getBlocksize());
+                       output.setValueType(ValueType.UNKNOWN);
+                       break;
                case TYPEOF:
                case DETECTSCHEMA:
                case COLNAMES:
diff --git a/src/main/java/org/apache/sysds/parser/DMLTranslator.java 
b/src/main/java/org/apache/sysds/parser/DMLTranslator.java
index 4d280a371a..c196f780c3 100644
--- a/src/main/java/org/apache/sysds/parser/DMLTranslator.java
+++ b/src/main/java/org/apache/sysds/parser/DMLTranslator.java
@@ -2507,6 +2507,9 @@ public class DMLTranslator
                case CAST_AS_FRAME:
                        currBuiltinOp = new UnaryOp(target.getName(), 
DataType.FRAME, target.getValueType(), OpOp1.CAST_AS_FRAME, expr);
                        break;
+               case CAST_AS_LIST:
+                       currBuiltinOp = new UnaryOp(target.getName(), 
DataType.LIST, target.getValueType(), OpOp1.CAST_AS_LIST, expr);
+                       break;
 
                //value type casts
                case CAST_AS_DOUBLE:
diff --git a/src/main/java/org/apache/sysds/parser/dml/Dml.g4 
b/src/main/java/org/apache/sysds/parser/dml/Dml.g4
index 91f3e98821..ac77d59357 100644
--- a/src/main/java/org/apache/sysds/parser/dml/Dml.g4
+++ b/src/main/java/org/apache/sysds/parser/dml/Dml.g4
@@ -184,7 +184,8 @@ strictParameterizedKeyValueString : paramName=ID '=' 
paramVal=STRING ;
 ID : (ALPHABET (ALPHABET|DIGIT|'_')*  '::')? ALPHABET (ALPHABET|DIGIT|'_')*
     // Special ID cases:
    // | 'matrix' // --> This is a special case which causes lot of headache
-   | 'as.scalar' | 'as.matrix' | 'as.frame' | 'as.double' | 'as.integer' | 
'as.logical' | 'as.boolean' | 'index.return' | 'empty.return' | 'lower.tail'
+   | 'as.scalar' | 'as.matrix' | 'as.frame' | 'as.list' 
+   | 'as.double' | 'as.integer' | 'as.logical' | 'as.boolean' | 'index.return' 
| 'empty.return' | 'lower.tail'
    | 'lower.tri' | 'upper.tri'
    | 'is.na' | 'is.nan' | 'is.infinite'
 ;
diff --git a/src/main/java/org/apache/sysds/parser/dml/DmlLexer.interp 
b/src/main/java/org/apache/sysds/parser/dml/DmlLexer.interp
index 2eb742a40c..7596635f5f 100644
--- a/src/main/java/org/apache/sysds/parser/dml/DmlLexer.interp
+++ b/src/main/java/org/apache/sysds/parser/dml/DmlLexer.interp
@@ -226,4 +226,4 @@ mode names:
 DEFAULT_MODE
 
 atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 72, 711, 8, 1, 
4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 
9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 
14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 
19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 
25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 
30, 4, 31, 9, 31, 4, 32, 9,  [...]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 72, 718, 8, 1, 
4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 
9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 
14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 
19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 
25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 
30, 4, 31, 9, 31, 4, 32, 9,  [...]
\ No newline at end of file
diff --git a/src/main/java/org/apache/sysds/parser/dml/DmlLexer.java 
b/src/main/java/org/apache/sysds/parser/dml/DmlLexer.java
index 4370642310..0ce5c153a0 100644
--- a/src/main/java/org/apache/sysds/parser/dml/DmlLexer.java
+++ b/src/main/java/org/apache/sysds/parser/dml/DmlLexer.java
@@ -155,7 +155,7 @@ public class DmlLexer extends Lexer {
        public ATN getATN() { return _ATN; }
 
        public static final String _serializedATN =
-               
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2H\u02c7\b\1\4\2\t"+
+               
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2H\u02ce\b\1\4\2\t"+
                
"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
                
"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
                
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@@ -187,220 +187,222 @@ public class DmlLexer extends Lexer {
                
"=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3"+
                
"=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3"+
                
"=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3"+
-               
"=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\5=\u023f\n=\3>\6"+
-               
">\u0242\n>\r>\16>\u0243\3>\5>\u0247\n>\3?\6?\u024a\n?\r?\16?\u024b\3?"+
-               
"\3?\7?\u0250\n?\f?\16?\u0253\13?\3?\5?\u0256\n?\3?\5?\u0259\n?\3?\6?\u025c"+
-               
"\n?\r?\16?\u025d\3?\5?\u0261\n?\3?\5?\u0264\n?\3?\3?\6?\u0268\n?\r?\16"+
-               
"?\u0269\3?\5?\u026d\n?\3?\5?\u0270\n?\5?\u0272\n?\3@\3@\3A\3A\3B\3B\5"+
-               
"B\u027a\nB\3B\3B\3C\3C\3C\3C\3C\7C\u0283\nC\fC\16C\u0286\13C\3D\3D\6D"+
-               
"\u028a\nD\rD\16D\u028b\3E\3E\3E\7E\u0291\nE\fE\16E\u0294\13E\3E\3E\3E"+
-               
"\3E\7E\u029a\nE\fE\16E\u029d\13E\3E\5E\u02a0\nE\3F\3F\3F\3G\3G\7G\u02a7"+
-               
"\nG\fG\16G\u02aa\13G\3G\5G\u02ad\nG\3G\3G\3G\3G\3H\3H\3H\3H\7H\u02b7\n"+
-               
"H\fH\16H\u02ba\13H\3H\3H\3H\3H\3H\3I\6I\u02c2\nI\rI\16I\u02c3\3I\3I\6"+
-               
"\u0292\u029b\u02a8\u02b8\2J\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25"+
-               
"\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32"+
-               "\63\33\65\34\67\359\36;\37= 
?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a"+
-               
"\62c\63e\64g\65i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083\2\u0085C\u0087"+
-               
"D\u0089E\u008b\2\u008dF\u008fG\u0091H\3\2\n\4\2NNnn\4\2C\\c|\4\2GGgg\4"+
-               
"\2--//\4\2$$^^\4\2))^^\n\2$$))^^ddhhppttvv\5\2\13\f\17\17\"\"\2\u02f6"+
-               
"\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2"+
-               
"\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2"+
-               
"\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2"+
-               
"\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2"+
-               
"\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3"+
-               
"\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2"+
-               
"\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2"+
-               
"U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3"+
-               
"\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2"+
-               
"\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2"+
-               
"{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0085\3\2\2\2\2\u0087"+
-               
"\3\2\2\2\2\u0089\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2"+
-               
"\2\3\u0093\3\2\2\2\5\u009a\3\2\2\2\7\u009c\3\2\2\2\t\u009e\3\2\2\2\13"+
-               
"\u00a1\3\2\2\2\r\u00a3\3\2\2\2\17\u00a9\3\2\2\2\21\u00ab\3\2\2\2\23\u00ae"+
-               
"\3\2\2\2\25\u00b0\3\2\2\2\27\u00b2\3\2\2\2\31\u00b4\3\2\2\2\33\u00ba\3"+
-               
"\2\2\2\35\u00bd\3\2\2\2\37\u00c0\3\2\2\2!\u00c2\3\2\2\2#\u00c4\3\2\2\2"+
-               
"%\u00c9\3\2\2\2\'\u00cd\3\2\2\2)\u00d0\3\2\2\2+\u00d7\3\2\2\2-\u00dd\3"+
-               
"\2\2\2/\u00df\3\2\2\2\61\u00e8\3\2\2\2\63\u00ef\3\2\2\2\65\u0100\3\2\2"+
-               
"\2\67\u010c\3\2\2\29\u010e\3\2\2\2;\u0110\3\2\2\2=\u0112\3\2\2\2?\u0116"+
-               
"\3\2\2\2A\u011a\3\2\2\2C\u011d\3\2\2\2E\u011f\3\2\2\2G\u0121\3\2\2\2I"+
-               
"\u0123\3\2\2\2K\u0126\3\2\2\2M\u0128\3\2\2\2O\u012b\3\2\2\2Q\u012e\3\2"+
-               
"\2\2S\u0131\3\2\2\2U\u0133\3\2\2\2W\u0135\3\2\2\2Y\u0138\3\2\2\2[\u013a"+
-               
"\3\2\2\2]\u013d\3\2\2\2_\u0142\3\2\2\2a\u0148\3\2\2\2c\u014c\3\2\2\2e"+
-               
"\u0154\3\2\2\2g\u015b\3\2\2\2i\u0163\3\2\2\2k\u016a\3\2\2\2m\u0172\3\2"+
-               
"\2\2o\u0176\3\2\2\2q\u017e\3\2\2\2s\u0185\3\2\2\2u\u018d\3\2\2\2w\u0194"+
-               
"\3\2\2\2y\u023e\3\2\2\2{\u0241\3\2\2\2}\u0271\3\2\2\2\177\u0273\3\2\2"+
-               
"\2\u0081\u0275\3\2\2\2\u0083\u0277\3\2\2\2\u0085\u027d\3\2\2\2\u0087\u0287"+
-               
"\3\2\2\2\u0089\u029f\3\2\2\2\u008b\u02a1\3\2\2\2\u008d\u02a4\3\2\2\2\u008f"+
-               
"\u02b2\3\2\2\2\u0091\u02c1\3\2\2\2\u0093\u0094\7u\2\2\u0094\u0095\7q\2"+
-               
"\2\u0095\u0096\7w\2\2\u0096\u0097\7t\2\2\u0097\u0098\7e\2\2\u0098\u0099"+
-               
"\7g\2\2\u0099\4\3\2\2\2\u009a\u009b\7*\2\2\u009b\6\3\2\2\2\u009c\u009d"+
-               
"\7+\2\2\u009d\b\3\2\2\2\u009e\u009f\7c\2\2\u009f\u00a0\7u\2\2\u00a0\n"+
-               
"\3\2\2\2\u00a1\u00a2\7=\2\2\u00a2\f\3\2\2\2\u00a3\u00a4\7u\2\2\u00a4\u00a5"+
-               
"\7g\2\2\u00a5\u00a6\7v\2\2\u00a6\u00a7\7y\2\2\u00a7\u00a8\7f\2\2\u00a8"+
-               
"\16\3\2\2\2\u00a9\u00aa\7?\2\2\u00aa\20\3\2\2\2\u00ab\u00ac\7>\2\2\u00ac"+
-               
"\u00ad\7/\2\2\u00ad\22\3\2\2\2\u00ae\u00af\7.\2\2\u00af\24\3\2\2\2\u00b0"+
-               
"\u00b1\7]\2\2\u00b1\26\3\2\2\2\u00b2\u00b3\7_\2\2\u00b3\30\3\2\2\2\u00b4"+
-               
"\u00b5\7k\2\2\u00b5\u00b6\7h\2\2\u00b6\u00b7\7f\2\2\u00b7\u00b8\7g\2\2"+
-               
"\u00b8\u00b9\7h\2\2\u00b9\32\3\2\2\2\u00ba\u00bb\7-\2\2\u00bb\u00bc\7"+
-               
"?\2\2\u00bc\34\3\2\2\2\u00bd\u00be\7k\2\2\u00be\u00bf\7h\2\2\u00bf\36"+
-               "\3\2\2\2\u00c0\u00c1\7}\2\2\u00c1 
\3\2\2\2\u00c2\u00c3\7\177\2\2\u00c3"+
-               
"\"\3\2\2\2\u00c4\u00c5\7g\2\2\u00c5\u00c6\7n\2\2\u00c6\u00c7\7u\2\2\u00c7"+
-               
"\u00c8\7g\2\2\u00c8$\3\2\2\2\u00c9\u00ca\7h\2\2\u00ca\u00cb\7q\2\2\u00cb"+
-               
"\u00cc\7t\2\2\u00cc&\3\2\2\2\u00cd\u00ce\7k\2\2\u00ce\u00cf\7p\2\2\u00cf"+
-               
"(\3\2\2\2\u00d0\u00d1\7r\2\2\u00d1\u00d2\7c\2\2\u00d2\u00d3\7t\2\2\u00d3"+
-               
"\u00d4\7h\2\2\u00d4\u00d5\7q\2\2\u00d5\u00d6\7t\2\2\u00d6*\3\2\2\2\u00d7"+
-               
"\u00d8\7y\2\2\u00d8\u00d9\7j\2\2\u00d9\u00da\7k\2\2\u00da\u00db\7n\2\2"+
-               
"\u00db\u00dc\7g\2\2\u00dc,\3\2\2\2\u00dd\u00de\7<\2\2\u00de.\3\2\2\2\u00df"+
-               
"\u00e0\7h\2\2\u00e0\u00e1\7w\2\2\u00e1\u00e2\7p\2\2\u00e2\u00e3\7e\2\2"+
-               
"\u00e3\u00e4\7v\2\2\u00e4\u00e5\7k\2\2\u00e5\u00e6\7q\2\2\u00e6\u00e7"+
-               
"\7p\2\2\u00e7\60\3\2\2\2\u00e8\u00e9\7t\2\2\u00e9\u00ea\7g\2\2\u00ea\u00eb"+
-               
"\7v\2\2\u00eb\u00ec\7w\2\2\u00ec\u00ed\7t\2\2\u00ed\u00ee\7p\2\2\u00ee"+
-               
"\62\3\2\2\2\u00ef\u00f0\7g\2\2\u00f0\u00f1\7z\2\2\u00f1\u00f2\7v\2\2\u00f2"+
-               
"\u00f3\7g\2\2\u00f3\u00f4\7t\2\2\u00f4\u00f5\7p\2\2\u00f5\u00f6\7c\2\2"+
-               
"\u00f6\u00f7\7n\2\2\u00f7\u00f8\7H\2\2\u00f8\u00f9\7w\2\2\u00f9\u00fa"+
-               
"\7p\2\2\u00fa\u00fb\7e\2\2\u00fb\u00fc\7v\2\2\u00fc\u00fd\7k\2\2\u00fd"+
-               
"\u00fe\7q\2\2\u00fe\u00ff\7p\2\2\u00ff\64\3\2\2\2\u0100\u0101\7k\2\2\u0101"+
-               
"\u0102\7o\2\2\u0102\u0103\7r\2\2\u0103\u0104\7n\2\2\u0104\u0105\7g\2\2"+
-               
"\u0105\u0106\7o\2\2\u0106\u0107\7g\2\2\u0107\u0108\7p\2\2\u0108\u0109"+
-               
"\7v\2\2\u0109\u010a\7g\2\2\u010a\u010b\7f\2\2\u010b\66\3\2\2\2\u010c\u010d"+
-               
"\7`\2\2\u010d8\3\2\2\2\u010e\u010f\7/\2\2\u010f:\3\2\2\2\u0110\u0111\7"+
-               
"-\2\2\u0111<\3\2\2\2\u0112\u0113\7\'\2\2\u0113\u0114\7,\2\2\u0114\u0115"+
-               
"\7\'\2\2\u0115>\3\2\2\2\u0116\u0117\7\'\2\2\u0117\u0118\7\61\2\2\u0118"+
-               
"\u0119\7\'\2\2\u0119@\3\2\2\2\u011a\u011b\7\'\2\2\u011b\u011c\7\'\2\2"+
-               
"\u011cB\3\2\2\2\u011d\u011e\7,\2\2\u011eD\3\2\2\2\u011f\u0120\7\61\2\2"+
-               
"\u0120F\3\2\2\2\u0121\u0122\7@\2\2\u0122H\3\2\2\2\u0123\u0124\7@\2\2\u0124"+
-               
"\u0125\7?\2\2\u0125J\3\2\2\2\u0126\u0127\7>\2\2\u0127L\3\2\2\2\u0128\u0129"+
-               
"\7>\2\2\u0129\u012a\7?\2\2\u012aN\3\2\2\2\u012b\u012c\7?\2\2\u012c\u012d"+
-               
"\7?\2\2\u012dP\3\2\2\2\u012e\u012f\7#\2\2\u012f\u0130\7?\2\2\u0130R\3"+
-               
"\2\2\2\u0131\u0132\7#\2\2\u0132T\3\2\2\2\u0133\u0134\7(\2\2\u0134V\3\2"+
-               
"\2\2\u0135\u0136\7(\2\2\u0136\u0137\7(\2\2\u0137X\3\2\2\2\u0138\u0139"+
-               
"\7~\2\2\u0139Z\3\2\2\2\u013a\u013b\7~\2\2\u013b\u013c\7~\2\2\u013c\\\3"+
-               
"\2\2\2\u013d\u013e\7V\2\2\u013e\u013f\7T\2\2\u013f\u0140\7W\2\2\u0140"+
-               
"\u0141\7G\2\2\u0141^\3\2\2\2\u0142\u0143\7H\2\2\u0143\u0144\7C\2\2\u0144"+
-               
"\u0145\7N\2\2\u0145\u0146\7U\2\2\u0146\u0147\7G\2\2\u0147`\3\2\2\2\u0148"+
-               
"\u0149\7k\2\2\u0149\u014a\7p\2\2\u014a\u014b\7v\2\2\u014bb\3\2\2\2\u014c"+
-               
"\u014d\7k\2\2\u014d\u014e\7p\2\2\u014e\u014f\7v\2\2\u014f\u0150\7g\2\2"+
-               
"\u0150\u0151\7i\2\2\u0151\u0152\7g\2\2\u0152\u0153\7t\2\2\u0153d\3\2\2"+
-               
"\2\u0154\u0155\7u\2\2\u0155\u0156\7v\2\2\u0156\u0157\7t\2\2\u0157\u0158"+
-               
"\7k\2\2\u0158\u0159\7p\2\2\u0159\u015a\7i\2\2\u015af\3\2\2\2\u015b\u015c"+
-               
"\7d\2\2\u015c\u015d\7q\2\2\u015d\u015e\7q\2\2\u015e\u015f\7n\2\2\u015f"+
-               
"\u0160\7g\2\2\u0160\u0161\7c\2\2\u0161\u0162\7p\2\2\u0162h\3\2\2\2\u0163"+
-               
"\u0164\7f\2\2\u0164\u0165\7q\2\2\u0165\u0166\7w\2\2\u0166\u0167\7d\2\2"+
-               
"\u0167\u0168\7n\2\2\u0168\u0169\7g\2\2\u0169j\3\2\2\2\u016a\u016b\7w\2"+
-               
"\2\u016b\u016c\7p\2\2\u016c\u016d\7m\2\2\u016d\u016e\7p\2\2\u016e\u016f"+
-               
"\7q\2\2\u016f\u0170\7y\2\2\u0170\u0171\7p\2\2\u0171l\3\2\2\2\u0172\u0173"+
-               
"\7K\2\2\u0173\u0174\7p\2\2\u0174\u0175\7v\2\2\u0175n\3\2\2\2\u0176\u0177"+
-               
"\7K\2\2\u0177\u0178\7p\2\2\u0178\u0179\7v\2\2\u0179\u017a\7g\2\2\u017a"+
-               
"\u017b\7i\2\2\u017b\u017c\7g\2\2\u017c\u017d\7t\2\2\u017dp\3\2\2\2\u017e"+
-               
"\u017f\7U\2\2\u017f\u0180\7v\2\2\u0180\u0181\7t\2\2\u0181\u0182\7k\2\2"+
-               
"\u0182\u0183\7p\2\2\u0183\u0184\7i\2\2\u0184r\3\2\2\2\u0185\u0186\7D\2"+
-               
"\2\u0186\u0187\7q\2\2\u0187\u0188\7q\2\2\u0188\u0189\7n\2\2\u0189\u018a"+
-               
"\7g\2\2\u018a\u018b\7c\2\2\u018b\u018c\7p\2\2\u018ct\3\2\2\2\u018d\u018e"+
-               
"\7F\2\2\u018e\u018f\7q\2\2\u018f\u0190\7w\2\2\u0190\u0191\7d\2\2\u0191"+
-               
"\u0192\7n\2\2\u0192\u0193\7g\2\2\u0193v\3\2\2\2\u0194\u0195\7W\2\2\u0195"+
-               
"\u0196\7p\2\2\u0196\u0197\7m\2\2\u0197\u0198\7p\2\2\u0198\u0199\7q\2\2"+
-               
"\u0199\u019a\7y\2\2\u019a\u019b\7p\2\2\u019bx\3\2\2\2\u019c\u01a2\5\u0081"+
-               
"A\2\u019d\u01a1\5\u0081A\2\u019e\u01a1\5\177@\2\u019f\u01a1\7a\2\2\u01a0"+
-               
"\u019d\3\2\2\2\u01a0\u019e\3\2\2\2\u01a0\u019f\3\2\2\2\u01a1\u01a4\3\2"+
-               
"\2\2\u01a2\u01a0\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3\u01a5\3\2\2\2\u01a4"+
-               
"\u01a2\3\2\2\2\u01a5\u01a6\7<\2\2\u01a6\u01a7\7<\2\2\u01a7\u01a9\3\2\2"+
-               
"\2\u01a8\u019c\3\2\2\2\u01a8\u01a9\3\2\2\2\u01a9\u01aa\3\2\2\2\u01aa\u01b0"+
-               
"\5\u0081A\2\u01ab\u01af\5\u0081A\2\u01ac\u01af\5\177@\2\u01ad\u01af\7"+
-               
"a\2\2\u01ae\u01ab\3\2\2\2\u01ae\u01ac\3\2\2\2\u01ae\u01ad\3\2\2\2\u01af"+
-               
"\u01b2\3\2\2\2\u01b0\u01ae\3\2\2\2\u01b0\u01b1\3\2\2\2\u01b1\u023f\3\2"+
-               
"\2\2\u01b2\u01b0\3\2\2\2\u01b3\u01b4\7c\2\2\u01b4\u01b5\7u\2\2\u01b5\u01b6"+
-               
"\7\60\2\2\u01b6\u01b7\7u\2\2\u01b7\u01b8\7e\2\2\u01b8\u01b9\7c\2\2\u01b9"+
-               
"\u01ba\7n\2\2\u01ba\u01bb\7c\2\2\u01bb\u023f\7t\2\2\u01bc\u01bd\7c\2\2"+
-               
"\u01bd\u01be\7u\2\2\u01be\u01bf\7\60\2\2\u01bf\u01c0\7o\2\2\u01c0\u01c1"+
-               
"\7c\2\2\u01c1\u01c2\7v\2\2\u01c2\u01c3\7t\2\2\u01c3\u01c4\7k\2\2\u01c4"+
-               
"\u023f\7z\2\2\u01c5\u01c6\7c\2\2\u01c6\u01c7\7u\2\2\u01c7\u01c8\7\60\2"+
-               
"\2\u01c8\u01c9\7h\2\2\u01c9\u01ca\7t\2\2\u01ca\u01cb\7c\2\2\u01cb\u01cc"+
-               
"\7o\2\2\u01cc\u023f\7g\2\2\u01cd\u01ce\7c\2\2\u01ce\u01cf\7u\2\2\u01cf"+
-               
"\u01d0\7\60\2\2\u01d0\u01d1\7f\2\2\u01d1\u01d2\7q\2\2\u01d2\u01d3\7w\2"+
-               
"\2\u01d3\u01d4\7d\2\2\u01d4\u01d5\7n\2\2\u01d5\u023f\7g\2\2\u01d6\u01d7"+
-               
"\7c\2\2\u01d7\u01d8\7u\2\2\u01d8\u01d9\7\60\2\2\u01d9\u01da\7k\2\2\u01da"+
-               
"\u01db\7p\2\2\u01db\u01dc\7v\2\2\u01dc\u01dd\7g\2\2\u01dd\u01de\7i\2\2"+
-               
"\u01de\u01df\7g\2\2\u01df\u023f\7t\2\2\u01e0\u01e1\7c\2\2\u01e1\u01e2"+
-               
"\7u\2\2\u01e2\u01e3\7\60\2\2\u01e3\u01e4\7n\2\2\u01e4\u01e5\7q\2\2\u01e5"+
-               
"\u01e6\7i\2\2\u01e6\u01e7\7k\2\2\u01e7\u01e8\7e\2\2\u01e8\u01e9\7c\2\2"+
-               
"\u01e9\u023f\7n\2\2\u01ea\u01eb\7c\2\2\u01eb\u01ec\7u\2\2\u01ec\u01ed"+
-               
"\7\60\2\2\u01ed\u01ee\7d\2\2\u01ee\u01ef\7q\2\2\u01ef\u01f0\7q\2\2\u01f0"+
-               
"\u01f1\7n\2\2\u01f1\u01f2\7g\2\2\u01f2\u01f3\7c\2\2\u01f3\u023f\7p\2\2"+
-               
"\u01f4\u01f5\7k\2\2\u01f5\u01f6\7p\2\2\u01f6\u01f7\7f\2\2\u01f7\u01f8"+
-               
"\7g\2\2\u01f8\u01f9\7z\2\2\u01f9\u01fa\7\60\2\2\u01fa\u01fb\7t\2\2\u01fb"+
-               
"\u01fc\7g\2\2\u01fc\u01fd\7v\2\2\u01fd\u01fe\7w\2\2\u01fe\u01ff\7t\2\2"+
-               
"\u01ff\u023f\7p\2\2\u0200\u0201\7g\2\2\u0201\u0202\7o\2\2\u0202\u0203"+
-               
"\7r\2\2\u0203\u0204\7v\2\2\u0204\u0205\7{\2\2\u0205\u0206\7\60\2\2\u0206"+
-               
"\u0207\7t\2\2\u0207\u0208\7g\2\2\u0208\u0209\7v\2\2\u0209\u020a\7w\2\2"+
-               
"\u020a\u020b\7t\2\2\u020b\u023f\7p\2\2\u020c\u020d\7n\2\2\u020d\u020e"+
-               
"\7q\2\2\u020e\u020f\7y\2\2\u020f\u0210\7g\2\2\u0210\u0211\7t\2\2\u0211"+
-               
"\u0212\7\60\2\2\u0212\u0213\7v\2\2\u0213\u0214\7c\2\2\u0214\u0215\7k\2"+
-               
"\2\u0215\u023f\7n\2\2\u0216\u0217\7n\2\2\u0217\u0218\7q\2\2\u0218\u0219"+
-               
"\7y\2\2\u0219\u021a\7g\2\2\u021a\u021b\7t\2\2\u021b\u021c\7\60\2\2\u021c"+
-               
"\u021d\7v\2\2\u021d\u021e\7t\2\2\u021e\u023f\7k\2\2\u021f\u0220\7w\2\2"+
-               
"\u0220\u0221\7r\2\2\u0221\u0222\7r\2\2\u0222\u0223\7g\2\2\u0223\u0224"+
-               
"\7t\2\2\u0224\u0225\7\60\2\2\u0225\u0226\7v\2\2\u0226\u0227\7t\2\2\u0227"+
-               
"\u023f\7k\2\2\u0228\u0229\7k\2\2\u0229\u022a\7u\2\2\u022a\u022b\7\60\2"+
-               
"\2\u022b\u022c\7p\2\2\u022c\u023f\7c\2\2\u022d\u022e\7k\2\2\u022e\u022f"+
-               
"\7u\2\2\u022f\u0230\7\60\2\2\u0230\u0231\7p\2\2\u0231\u0232\7c\2\2\u0232"+
-               
"\u023f\7p\2\2\u0233\u0234\7k\2\2\u0234\u0235\7u\2\2\u0235\u0236\7\60\2"+
-               
"\2\u0236\u0237\7k\2\2\u0237\u0238\7p\2\2\u0238\u0239\7h\2\2\u0239\u023a"+
-               
"\7k\2\2\u023a\u023b\7p\2\2\u023b\u023c\7k\2\2\u023c\u023d\7v\2\2\u023d"+
-               
"\u023f\7g\2\2\u023e\u01a8\3\2\2\2\u023e\u01b3\3\2\2\2\u023e\u01bc\3\2"+
-               
"\2\2\u023e\u01c5\3\2\2\2\u023e\u01cd\3\2\2\2\u023e\u01d6\3\2\2\2\u023e"+
-               
"\u01e0\3\2\2\2\u023e\u01ea\3\2\2\2\u023e\u01f4\3\2\2\2\u023e\u0200\3\2"+
-               
"\2\2\u023e\u020c\3\2\2\2\u023e\u0216\3\2\2\2\u023e\u021f\3\2\2\2\u023e"+
-               
"\u0228\3\2\2\2\u023e\u022d\3\2\2\2\u023e\u0233\3\2\2\2\u023fz\3\2\2\2"+
-               
"\u0240\u0242\5\177@\2\u0241\u0240\3\2\2\2\u0242\u0243\3\2\2\2\u0243\u0241"+
-               
"\3\2\2\2\u0243\u0244\3\2\2\2\u0244\u0246\3\2\2\2\u0245\u0247\t\2\2\2\u0246"+
-               
"\u0245\3\2\2\2\u0246\u0247\3\2\2\2\u0247|\3\2\2\2\u0248\u024a\5\177@\2"+
-               
"\u0249\u0248\3\2\2\2\u024a\u024b\3\2\2\2\u024b\u0249\3\2\2\2\u024b\u024c"+
-               
"\3\2\2\2\u024c\u024d\3\2\2\2\u024d\u0251\7\60\2\2\u024e\u0250\5\177@\2"+
-               
"\u024f\u024e\3\2\2\2\u0250\u0253\3\2\2\2\u0251\u024f\3\2\2\2\u0251\u0252"+
-               
"\3\2\2\2\u0252\u0255\3\2\2\2\u0253\u0251\3\2\2\2\u0254\u0256\5\u0083B"+
-               
"\2\u0255\u0254\3\2\2\2\u0255\u0256\3\2\2\2\u0256\u0258\3\2\2\2\u0257\u0259"+
-               
"\t\2\2\2\u0258\u0257\3\2\2\2\u0258\u0259\3\2\2\2\u0259\u0272\3\2\2\2\u025a"+
-               
"\u025c\5\177@\2\u025b\u025a\3\2\2\2\u025c\u025d\3\2\2\2\u025d\u025b\3"+
-               
"\2\2\2\u025d\u025e\3\2\2\2\u025e\u0260\3\2\2\2\u025f\u0261\5\u0083B\2"+
-               
"\u0260\u025f\3\2\2\2\u0260\u0261\3\2\2\2\u0261\u0263\3\2\2\2\u0262\u0264"+
-               
"\t\2\2\2\u0263\u0262\3\2\2\2\u0263\u0264\3\2\2\2\u0264\u0272\3\2\2\2\u0265"+
-               
"\u0267\7\60\2\2\u0266\u0268\5\177@\2\u0267\u0266\3\2\2\2\u0268\u0269\3"+
-               
"\2\2\2\u0269\u0267\3\2\2\2\u0269\u026a\3\2\2\2\u026a\u026c\3\2\2\2\u026b"+
-               
"\u026d\5\u0083B\2\u026c\u026b\3\2\2\2\u026c\u026d\3\2\2\2\u026d\u026f"+
-               
"\3\2\2\2\u026e\u0270\t\2\2\2\u026f\u026e\3\2\2\2\u026f\u0270\3\2\2\2\u0270"+
-               
"\u0272\3\2\2\2\u0271\u0249\3\2\2\2\u0271\u025b\3\2\2\2\u0271\u0265\3\2"+
-               
"\2\2\u0272~\3\2\2\2\u0273\u0274\4\62;\2\u0274\u0080\3\2\2\2\u0275\u0276"+
-               
"\t\3\2\2\u0276\u0082\3\2\2\2\u0277\u0279\t\4\2\2\u0278\u027a\t\5\2\2\u0279"+
-               
"\u0278\3\2\2\2\u0279\u027a\3\2\2\2\u027a\u027b\3\2\2\2\u027b\u027c\5{"+
-               
">\2\u027c\u0084\3\2\2\2\u027d\u027e\7&\2\2\u027e\u0284\5\u0081A\2\u027f"+
-               
"\u0283\5\u0081A\2\u0280\u0283\5\177@\2\u0281\u0283\7a\2\2\u0282\u027f"+
-               
"\3\2\2\2\u0282\u0280\3\2\2\2\u0282\u0281\3\2\2\2\u0283\u0286\3\2\2\2\u0284"+
-               
"\u0282\3\2\2\2\u0284\u0285\3\2\2\2\u0285\u0086\3\2\2\2\u0286\u0284\3\2"+
-               
"\2\2\u0287\u0289\7&\2\2\u0288\u028a\5\177@\2\u0289\u0288\3\2\2\2\u028a"+
-               
"\u028b\3\2\2\2\u028b\u0289\3\2\2\2\u028b\u028c\3\2\2\2\u028c\u0088\3\2"+
-               
"\2\2\u028d\u0292\7$\2\2\u028e\u0291\5\u008bF\2\u028f\u0291\n\6\2\2\u0290"+
-               
"\u028e\3\2\2\2\u0290\u028f\3\2\2\2\u0291\u0294\3\2\2\2\u0292\u0293\3\2"+
-               
"\2\2\u0292\u0290\3\2\2\2\u0293\u0295\3\2\2\2\u0294\u0292\3\2\2\2\u0295"+
-               
"\u02a0\7$\2\2\u0296\u029b\7)\2\2\u0297\u029a\5\u008bF\2\u0298\u029a\n"+
-               
"\7\2\2\u0299\u0297\3\2\2\2\u0299\u0298\3\2\2\2\u029a\u029d\3\2\2\2\u029b"+
-               
"\u029c\3\2\2\2\u029b\u0299\3\2\2\2\u029c\u029e\3\2\2\2\u029d\u029b\3\2"+
-               
"\2\2\u029e\u02a0\7)\2\2\u029f\u028d\3\2\2\2\u029f\u0296\3\2\2\2\u02a0"+
-               
"\u008a\3\2\2\2\u02a1\u02a2\7^\2\2\u02a2\u02a3\t\b\2\2\u02a3\u008c\3\2"+
-               
"\2\2\u02a4\u02a8\7%\2\2\u02a5\u02a7\13\2\2\2\u02a6\u02a5\3\2\2\2\u02a7"+
-               
"\u02aa\3\2\2\2\u02a8\u02a9\3\2\2\2\u02a8\u02a6\3\2\2\2\u02a9\u02ac\3\2"+
-               
"\2\2\u02aa\u02a8\3\2\2\2\u02ab\u02ad\7\17\2\2\u02ac\u02ab\3\2\2\2\u02ac"+
-               
"\u02ad\3\2\2\2\u02ad\u02ae\3\2\2\2\u02ae\u02af\7\f\2\2\u02af\u02b0\3\2"+
-               
"\2\2\u02b0\u02b1\bG\2\2\u02b1\u008e\3\2\2\2\u02b2\u02b3\7\61\2\2\u02b3"+
-               
"\u02b4\7,\2\2\u02b4\u02b8\3\2\2\2\u02b5\u02b7\13\2\2\2\u02b6\u02b5\3\2"+
-               
"\2\2\u02b7\u02ba\3\2\2\2\u02b8\u02b9\3\2\2\2\u02b8\u02b6\3\2\2\2\u02b9"+
-               
"\u02bb\3\2\2\2\u02ba\u02b8\3\2\2\2\u02bb\u02bc\7,\2\2\u02bc\u02bd\7\61"+
-               
"\2\2\u02bd\u02be\3\2\2\2\u02be\u02bf\bH\2\2\u02bf\u0090\3\2\2\2\u02c0"+
-               
"\u02c2\t\t\2\2\u02c1\u02c0\3\2\2\2\u02c2\u02c3\3\2\2\2\u02c3\u02c1\3\2"+
-               
"\2\2\u02c3\u02c4\3\2\2\2\u02c4\u02c5\3\2\2\2\u02c5\u02c6\bI\2\2\u02c6"+
-               
"\u0092\3\2\2\2#\2\u01a0\u01a2\u01a8\u01ae\u01b0\u023e\u0243\u0246\u024b"+
-               
"\u0251\u0255\u0258\u025d\u0260\u0263\u0269\u026c\u026f\u0271\u0279\u0282"+
-               
"\u0284\u028b\u0290\u0292\u0299\u029b\u029f\u02a8\u02ac\u02b8\u02c3\3\b"+
-               "\2\2";
+               
"=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3"+
+               
"=\3=\5=\u0246\n=\3>\6>\u0249\n>\r>\16>\u024a\3>\5>\u024e\n>\3?\6?\u0251"+
+               
"\n?\r?\16?\u0252\3?\3?\7?\u0257\n?\f?\16?\u025a\13?\3?\5?\u025d\n?\3?"+
+               
"\5?\u0260\n?\3?\6?\u0263\n?\r?\16?\u0264\3?\5?\u0268\n?\3?\5?\u026b\n"+
+               
"?\3?\3?\6?\u026f\n?\r?\16?\u0270\3?\5?\u0274\n?\3?\5?\u0277\n?\5?\u0279"+
+               
"\n?\3@\3@\3A\3A\3B\3B\5B\u0281\nB\3B\3B\3C\3C\3C\3C\3C\7C\u028a\nC\fC"+
+               
"\16C\u028d\13C\3D\3D\6D\u0291\nD\rD\16D\u0292\3E\3E\3E\7E\u0298\nE\fE"+
+               
"\16E\u029b\13E\3E\3E\3E\3E\7E\u02a1\nE\fE\16E\u02a4\13E\3E\5E\u02a7\n"+
+               
"E\3F\3F\3F\3G\3G\7G\u02ae\nG\fG\16G\u02b1\13G\3G\5G\u02b4\nG\3G\3G\3G"+
+               
"\3G\3H\3H\3H\3H\7H\u02be\nH\fH\16H\u02c1\13H\3H\3H\3H\3H\3H\3I\6I\u02c9"+
+               
"\nI\rI\16I\u02ca\3I\3I\6\u0299\u02a2\u02af\u02bf\2J\3\3\5\4\7\5\t\6\13"+
+               
"\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'"+
+               "\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= 
?!A\"C#E$G%I&K\'"+
+               
"M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u<w=y>{?}@\177"+
+               
"A\u0081B\u0083\2\u0085C\u0087D\u0089E\u008b\2\u008dF\u008fG\u0091H\3\2"+
+               
"\n\4\2NNnn\4\2C\\c|\4\2GGgg\4\2--//\4\2$$^^\4\2))^^\n\2$$))^^ddhhpptt"+
+               
"vv\5\2\13\f\17\17\"\"\2\u02fe\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t"+
+               
"\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2"+
+               
"\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2"+
+               
"\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2"+
+               
"+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2"+
+               
"\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2"+
+               
"C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3"+
+               
"\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2"+
+               
"\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2"+
+               
"i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3"+
+               
"\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081"+
+               
"\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008d\3\2\2"+
+               
"\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\3\u0093\3\2\2\2\5\u009a\3\2\2\2\7\u009c"+
+               
"\3\2\2\2\t\u009e\3\2\2\2\13\u00a1\3\2\2\2\r\u00a3\3\2\2\2\17\u00a9\3\2"+
+               
"\2\2\21\u00ab\3\2\2\2\23\u00ae\3\2\2\2\25\u00b0\3\2\2\2\27\u00b2\3\2\2"+
+               
"\2\31\u00b4\3\2\2\2\33\u00ba\3\2\2\2\35\u00bd\3\2\2\2\37\u00c0\3\2\2\2"+
+               
"!\u00c2\3\2\2\2#\u00c4\3\2\2\2%\u00c9\3\2\2\2\'\u00cd\3\2\2\2)\u00d0\3"+
+               
"\2\2\2+\u00d7\3\2\2\2-\u00dd\3\2\2\2/\u00df\3\2\2\2\61\u00e8\3\2\2\2\63"+
+               
"\u00ef\3\2\2\2\65\u0100\3\2\2\2\67\u010c\3\2\2\29\u010e\3\2\2\2;\u0110"+
+               
"\3\2\2\2=\u0112\3\2\2\2?\u0116\3\2\2\2A\u011a\3\2\2\2C\u011d\3\2\2\2E"+
+               
"\u011f\3\2\2\2G\u0121\3\2\2\2I\u0123\3\2\2\2K\u0126\3\2\2\2M\u0128\3\2"+
+               
"\2\2O\u012b\3\2\2\2Q\u012e\3\2\2\2S\u0131\3\2\2\2U\u0133\3\2\2\2W\u0135"+
+               
"\3\2\2\2Y\u0138\3\2\2\2[\u013a\3\2\2\2]\u013d\3\2\2\2_\u0142\3\2\2\2a"+
+               
"\u0148\3\2\2\2c\u014c\3\2\2\2e\u0154\3\2\2\2g\u015b\3\2\2\2i\u0163\3\2"+
+               
"\2\2k\u016a\3\2\2\2m\u0172\3\2\2\2o\u0176\3\2\2\2q\u017e\3\2\2\2s\u0185"+
+               
"\3\2\2\2u\u018d\3\2\2\2w\u0194\3\2\2\2y\u0245\3\2\2\2{\u0248\3\2\2\2}"+
+               
"\u0278\3\2\2\2\177\u027a\3\2\2\2\u0081\u027c\3\2\2\2\u0083\u027e\3\2\2"+
+               
"\2\u0085\u0284\3\2\2\2\u0087\u028e\3\2\2\2\u0089\u02a6\3\2\2\2\u008b\u02a8"+
+               
"\3\2\2\2\u008d\u02ab\3\2\2\2\u008f\u02b9\3\2\2\2\u0091\u02c8\3\2\2\2\u0093"+
+               
"\u0094\7u\2\2\u0094\u0095\7q\2\2\u0095\u0096\7w\2\2\u0096\u0097\7t\2\2"+
+               
"\u0097\u0098\7e\2\2\u0098\u0099\7g\2\2\u0099\4\3\2\2\2\u009a\u009b\7*"+
+               
"\2\2\u009b\6\3\2\2\2\u009c\u009d\7+\2\2\u009d\b\3\2\2\2\u009e\u009f\7"+
+               
"c\2\2\u009f\u00a0\7u\2\2\u00a0\n\3\2\2\2\u00a1\u00a2\7=\2\2\u00a2\f\3"+
+               
"\2\2\2\u00a3\u00a4\7u\2\2\u00a4\u00a5\7g\2\2\u00a5\u00a6\7v\2\2\u00a6"+
+               
"\u00a7\7y\2\2\u00a7\u00a8\7f\2\2\u00a8\16\3\2\2\2\u00a9\u00aa\7?\2\2\u00aa"+
+               
"\20\3\2\2\2\u00ab\u00ac\7>\2\2\u00ac\u00ad\7/\2\2\u00ad\22\3\2\2\2\u00ae"+
+               
"\u00af\7.\2\2\u00af\24\3\2\2\2\u00b0\u00b1\7]\2\2\u00b1\26\3\2\2\2\u00b2"+
+               
"\u00b3\7_\2\2\u00b3\30\3\2\2\2\u00b4\u00b5\7k\2\2\u00b5\u00b6\7h\2\2\u00b6"+
+               
"\u00b7\7f\2\2\u00b7\u00b8\7g\2\2\u00b8\u00b9\7h\2\2\u00b9\32\3\2\2\2\u00ba"+
+               
"\u00bb\7-\2\2\u00bb\u00bc\7?\2\2\u00bc\34\3\2\2\2\u00bd\u00be\7k\2\2\u00be"+
+               "\u00bf\7h\2\2\u00bf\36\3\2\2\2\u00c0\u00c1\7}\2\2\u00c1 
\3\2\2\2\u00c2"+
+               
"\u00c3\7\177\2\2\u00c3\"\3\2\2\2\u00c4\u00c5\7g\2\2\u00c5\u00c6\7n\2\2"+
+               
"\u00c6\u00c7\7u\2\2\u00c7\u00c8\7g\2\2\u00c8$\3\2\2\2\u00c9\u00ca\7h\2"+
+               
"\2\u00ca\u00cb\7q\2\2\u00cb\u00cc\7t\2\2\u00cc&\3\2\2\2\u00cd\u00ce\7"+
+               
"k\2\2\u00ce\u00cf\7p\2\2\u00cf(\3\2\2\2\u00d0\u00d1\7r\2\2\u00d1\u00d2"+
+               
"\7c\2\2\u00d2\u00d3\7t\2\2\u00d3\u00d4\7h\2\2\u00d4\u00d5\7q\2\2\u00d5"+
+               
"\u00d6\7t\2\2\u00d6*\3\2\2\2\u00d7\u00d8\7y\2\2\u00d8\u00d9\7j\2\2\u00d9"+
+               
"\u00da\7k\2\2\u00da\u00db\7n\2\2\u00db\u00dc\7g\2\2\u00dc,\3\2\2\2\u00dd"+
+               
"\u00de\7<\2\2\u00de.\3\2\2\2\u00df\u00e0\7h\2\2\u00e0\u00e1\7w\2\2\u00e1"+
+               
"\u00e2\7p\2\2\u00e2\u00e3\7e\2\2\u00e3\u00e4\7v\2\2\u00e4\u00e5\7k\2\2"+
+               
"\u00e5\u00e6\7q\2\2\u00e6\u00e7\7p\2\2\u00e7\60\3\2\2\2\u00e8\u00e9\7"+
+               
"t\2\2\u00e9\u00ea\7g\2\2\u00ea\u00eb\7v\2\2\u00eb\u00ec\7w\2\2\u00ec\u00ed"+
+               
"\7t\2\2\u00ed\u00ee\7p\2\2\u00ee\62\3\2\2\2\u00ef\u00f0\7g\2\2\u00f0\u00f1"+
+               
"\7z\2\2\u00f1\u00f2\7v\2\2\u00f2\u00f3\7g\2\2\u00f3\u00f4\7t\2\2\u00f4"+
+               
"\u00f5\7p\2\2\u00f5\u00f6\7c\2\2\u00f6\u00f7\7n\2\2\u00f7\u00f8\7H\2\2"+
+               
"\u00f8\u00f9\7w\2\2\u00f9\u00fa\7p\2\2\u00fa\u00fb\7e\2\2\u00fb\u00fc"+
+               
"\7v\2\2\u00fc\u00fd\7k\2\2\u00fd\u00fe\7q\2\2\u00fe\u00ff\7p\2\2\u00ff"+
+               
"\64\3\2\2\2\u0100\u0101\7k\2\2\u0101\u0102\7o\2\2\u0102\u0103\7r\2\2\u0103"+
+               
"\u0104\7n\2\2\u0104\u0105\7g\2\2\u0105\u0106\7o\2\2\u0106\u0107\7g\2\2"+
+               
"\u0107\u0108\7p\2\2\u0108\u0109\7v\2\2\u0109\u010a\7g\2\2\u010a\u010b"+
+               
"\7f\2\2\u010b\66\3\2\2\2\u010c\u010d\7`\2\2\u010d8\3\2\2\2\u010e\u010f"+
+               
"\7/\2\2\u010f:\3\2\2\2\u0110\u0111\7-\2\2\u0111<\3\2\2\2\u0112\u0113\7"+
+               
"\'\2\2\u0113\u0114\7,\2\2\u0114\u0115\7\'\2\2\u0115>\3\2\2\2\u0116\u0117"+
+               
"\7\'\2\2\u0117\u0118\7\61\2\2\u0118\u0119\7\'\2\2\u0119@\3\2\2\2\u011a"+
+               
"\u011b\7\'\2\2\u011b\u011c\7\'\2\2\u011cB\3\2\2\2\u011d\u011e\7,\2\2\u011e"+
+               
"D\3\2\2\2\u011f\u0120\7\61\2\2\u0120F\3\2\2\2\u0121\u0122\7@\2\2\u0122"+
+               
"H\3\2\2\2\u0123\u0124\7@\2\2\u0124\u0125\7?\2\2\u0125J\3\2\2\2\u0126\u0127"+
+               
"\7>\2\2\u0127L\3\2\2\2\u0128\u0129\7>\2\2\u0129\u012a\7?\2\2\u012aN\3"+
+               
"\2\2\2\u012b\u012c\7?\2\2\u012c\u012d\7?\2\2\u012dP\3\2\2\2\u012e\u012f"+
+               
"\7#\2\2\u012f\u0130\7?\2\2\u0130R\3\2\2\2\u0131\u0132\7#\2\2\u0132T\3"+
+               
"\2\2\2\u0133\u0134\7(\2\2\u0134V\3\2\2\2\u0135\u0136\7(\2\2\u0136\u0137"+
+               
"\7(\2\2\u0137X\3\2\2\2\u0138\u0139\7~\2\2\u0139Z\3\2\2\2\u013a\u013b\7"+
+               
"~\2\2\u013b\u013c\7~\2\2\u013c\\\3\2\2\2\u013d\u013e\7V\2\2\u013e\u013f"+
+               
"\7T\2\2\u013f\u0140\7W\2\2\u0140\u0141\7G\2\2\u0141^\3\2\2\2\u0142\u0143"+
+               
"\7H\2\2\u0143\u0144\7C\2\2\u0144\u0145\7N\2\2\u0145\u0146\7U\2\2\u0146"+
+               
"\u0147\7G\2\2\u0147`\3\2\2\2\u0148\u0149\7k\2\2\u0149\u014a\7p\2\2\u014a"+
+               
"\u014b\7v\2\2\u014bb\3\2\2\2\u014c\u014d\7k\2\2\u014d\u014e\7p\2\2\u014e"+
+               
"\u014f\7v\2\2\u014f\u0150\7g\2\2\u0150\u0151\7i\2\2\u0151\u0152\7g\2\2"+
+               
"\u0152\u0153\7t\2\2\u0153d\3\2\2\2\u0154\u0155\7u\2\2\u0155\u0156\7v\2"+
+               
"\2\u0156\u0157\7t\2\2\u0157\u0158\7k\2\2\u0158\u0159\7p\2\2\u0159\u015a"+
+               
"\7i\2\2\u015af\3\2\2\2\u015b\u015c\7d\2\2\u015c\u015d\7q\2\2\u015d\u015e"+
+               
"\7q\2\2\u015e\u015f\7n\2\2\u015f\u0160\7g\2\2\u0160\u0161\7c\2\2\u0161"+
+               
"\u0162\7p\2\2\u0162h\3\2\2\2\u0163\u0164\7f\2\2\u0164\u0165\7q\2\2\u0165"+
+               
"\u0166\7w\2\2\u0166\u0167\7d\2\2\u0167\u0168\7n\2\2\u0168\u0169\7g\2\2"+
+               
"\u0169j\3\2\2\2\u016a\u016b\7w\2\2\u016b\u016c\7p\2\2\u016c\u016d\7m\2"+
+               
"\2\u016d\u016e\7p\2\2\u016e\u016f\7q\2\2\u016f\u0170\7y\2\2\u0170\u0171"+
+               
"\7p\2\2\u0171l\3\2\2\2\u0172\u0173\7K\2\2\u0173\u0174\7p\2\2\u0174\u0175"+
+               
"\7v\2\2\u0175n\3\2\2\2\u0176\u0177\7K\2\2\u0177\u0178\7p\2\2\u0178\u0179"+
+               
"\7v\2\2\u0179\u017a\7g\2\2\u017a\u017b\7i\2\2\u017b\u017c\7g\2\2\u017c"+
+               
"\u017d\7t\2\2\u017dp\3\2\2\2\u017e\u017f\7U\2\2\u017f\u0180\7v\2\2\u0180"+
+               
"\u0181\7t\2\2\u0181\u0182\7k\2\2\u0182\u0183\7p\2\2\u0183\u0184\7i\2\2"+
+               
"\u0184r\3\2\2\2\u0185\u0186\7D\2\2\u0186\u0187\7q\2\2\u0187\u0188\7q\2"+
+               
"\2\u0188\u0189\7n\2\2\u0189\u018a\7g\2\2\u018a\u018b\7c\2\2\u018b\u018c"+
+               
"\7p\2\2\u018ct\3\2\2\2\u018d\u018e\7F\2\2\u018e\u018f\7q\2\2\u018f\u0190"+
+               
"\7w\2\2\u0190\u0191\7d\2\2\u0191\u0192\7n\2\2\u0192\u0193\7g\2\2\u0193"+
+               
"v\3\2\2\2\u0194\u0195\7W\2\2\u0195\u0196\7p\2\2\u0196\u0197\7m\2\2\u0197"+
+               
"\u0198\7p\2\2\u0198\u0199\7q\2\2\u0199\u019a\7y\2\2\u019a\u019b\7p\2\2"+
+               
"\u019bx\3\2\2\2\u019c\u01a2\5\u0081A\2\u019d\u01a1\5\u0081A\2\u019e\u01a1"+
+               
"\5\177@\2\u019f\u01a1\7a\2\2\u01a0\u019d\3\2\2\2\u01a0\u019e\3\2\2\2\u01a0"+
+               
"\u019f\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2\u01a0\3\2\2\2\u01a2\u01a3\3\2"+
+               
"\2\2\u01a3\u01a5\3\2\2\2\u01a4\u01a2\3\2\2\2\u01a5\u01a6\7<\2\2\u01a6"+
+               
"\u01a7\7<\2\2\u01a7\u01a9\3\2\2\2\u01a8\u019c\3\2\2\2\u01a8\u01a9\3\2"+
+               
"\2\2\u01a9\u01aa\3\2\2\2\u01aa\u01b0\5\u0081A\2\u01ab\u01af\5\u0081A\2"+
+               
"\u01ac\u01af\5\177@\2\u01ad\u01af\7a\2\2\u01ae\u01ab\3\2\2\2\u01ae\u01ac"+
+               
"\3\2\2\2\u01ae\u01ad\3\2\2\2\u01af\u01b2\3\2\2\2\u01b0\u01ae\3\2\2\2\u01b0"+
+               
"\u01b1\3\2\2\2\u01b1\u0246\3\2\2\2\u01b2\u01b0\3\2\2\2\u01b3\u01b4\7c"+
+               
"\2\2\u01b4\u01b5\7u\2\2\u01b5\u01b6\7\60\2\2\u01b6\u01b7\7u\2\2\u01b7"+
+               
"\u01b8\7e\2\2\u01b8\u01b9\7c\2\2\u01b9\u01ba\7n\2\2\u01ba\u01bb\7c\2\2"+
+               
"\u01bb\u0246\7t\2\2\u01bc\u01bd\7c\2\2\u01bd\u01be\7u\2\2\u01be\u01bf"+
+               
"\7\60\2\2\u01bf\u01c0\7o\2\2\u01c0\u01c1\7c\2\2\u01c1\u01c2\7v\2\2\u01c2"+
+               
"\u01c3\7t\2\2\u01c3\u01c4\7k\2\2\u01c4\u0246\7z\2\2\u01c5\u01c6\7c\2\2"+
+               
"\u01c6\u01c7\7u\2\2\u01c7\u01c8\7\60\2\2\u01c8\u01c9\7h\2\2\u01c9\u01ca"+
+               
"\7t\2\2\u01ca\u01cb\7c\2\2\u01cb\u01cc\7o\2\2\u01cc\u0246\7g\2\2\u01cd"+
+               
"\u01ce\7c\2\2\u01ce\u01cf\7u\2\2\u01cf\u01d0\7\60\2\2\u01d0\u01d1\7n\2"+
+               
"\2\u01d1\u01d2\7k\2\2\u01d2\u01d3\7u\2\2\u01d3\u0246\7v\2\2\u01d4\u01d5"+
+               
"\7c\2\2\u01d5\u01d6\7u\2\2\u01d6\u01d7\7\60\2\2\u01d7\u01d8\7f\2\2\u01d8"+
+               
"\u01d9\7q\2\2\u01d9\u01da\7w\2\2\u01da\u01db\7d\2\2\u01db\u01dc\7n\2\2"+
+               
"\u01dc\u0246\7g\2\2\u01dd\u01de\7c\2\2\u01de\u01df\7u\2\2\u01df\u01e0"+
+               
"\7\60\2\2\u01e0\u01e1\7k\2\2\u01e1\u01e2\7p\2\2\u01e2\u01e3\7v\2\2\u01e3"+
+               
"\u01e4\7g\2\2\u01e4\u01e5\7i\2\2\u01e5\u01e6\7g\2\2\u01e6\u0246\7t\2\2"+
+               
"\u01e7\u01e8\7c\2\2\u01e8\u01e9\7u\2\2\u01e9\u01ea\7\60\2\2\u01ea\u01eb"+
+               
"\7n\2\2\u01eb\u01ec\7q\2\2\u01ec\u01ed\7i\2\2\u01ed\u01ee\7k\2\2\u01ee"+
+               
"\u01ef\7e\2\2\u01ef\u01f0\7c\2\2\u01f0\u0246\7n\2\2\u01f1\u01f2\7c\2\2"+
+               
"\u01f2\u01f3\7u\2\2\u01f3\u01f4\7\60\2\2\u01f4\u01f5\7d\2\2\u01f5\u01f6"+
+               
"\7q\2\2\u01f6\u01f7\7q\2\2\u01f7\u01f8\7n\2\2\u01f8\u01f9\7g\2\2\u01f9"+
+               
"\u01fa\7c\2\2\u01fa\u0246\7p\2\2\u01fb\u01fc\7k\2\2\u01fc\u01fd\7p\2\2"+
+               
"\u01fd\u01fe\7f\2\2\u01fe\u01ff\7g\2\2\u01ff\u0200\7z\2\2\u0200\u0201"+
+               
"\7\60\2\2\u0201\u0202\7t\2\2\u0202\u0203\7g\2\2\u0203\u0204\7v\2\2\u0204"+
+               
"\u0205\7w\2\2\u0205\u0206\7t\2\2\u0206\u0246\7p\2\2\u0207\u0208\7g\2\2"+
+               
"\u0208\u0209\7o\2\2\u0209\u020a\7r\2\2\u020a\u020b\7v\2\2\u020b\u020c"+
+               
"\7{\2\2\u020c\u020d\7\60\2\2\u020d\u020e\7t\2\2\u020e\u020f\7g\2\2\u020f"+
+               
"\u0210\7v\2\2\u0210\u0211\7w\2\2\u0211\u0212\7t\2\2\u0212\u0246\7p\2\2"+
+               
"\u0213\u0214\7n\2\2\u0214\u0215\7q\2\2\u0215\u0216\7y\2\2\u0216\u0217"+
+               
"\7g\2\2\u0217\u0218\7t\2\2\u0218\u0219\7\60\2\2\u0219\u021a\7v\2\2\u021a"+
+               
"\u021b\7c\2\2\u021b\u021c\7k\2\2\u021c\u0246\7n\2\2\u021d\u021e\7n\2\2"+
+               
"\u021e\u021f\7q\2\2\u021f\u0220\7y\2\2\u0220\u0221\7g\2\2\u0221\u0222"+
+               
"\7t\2\2\u0222\u0223\7\60\2\2\u0223\u0224\7v\2\2\u0224\u0225\7t\2\2\u0225"+
+               
"\u0246\7k\2\2\u0226\u0227\7w\2\2\u0227\u0228\7r\2\2\u0228\u0229\7r\2\2"+
+               
"\u0229\u022a\7g\2\2\u022a\u022b\7t\2\2\u022b\u022c\7\60\2\2\u022c\u022d"+
+               
"\7v\2\2\u022d\u022e\7t\2\2\u022e\u0246\7k\2\2\u022f\u0230\7k\2\2\u0230"+
+               
"\u0231\7u\2\2\u0231\u0232\7\60\2\2\u0232\u0233\7p\2\2\u0233\u0246\7c\2"+
+               
"\2\u0234\u0235\7k\2\2\u0235\u0236\7u\2\2\u0236\u0237\7\60\2\2\u0237\u0238"+
+               
"\7p\2\2\u0238\u0239\7c\2\2\u0239\u0246\7p\2\2\u023a\u023b\7k\2\2\u023b"+
+               
"\u023c\7u\2\2\u023c\u023d\7\60\2\2\u023d\u023e\7k\2\2\u023e\u023f\7p\2"+
+               
"\2\u023f\u0240\7h\2\2\u0240\u0241\7k\2\2\u0241\u0242\7p\2\2\u0242\u0243"+
+               
"\7k\2\2\u0243\u0244\7v\2\2\u0244\u0246\7g\2\2\u0245\u01a8\3\2\2\2\u0245"+
+               
"\u01b3\3\2\2\2\u0245\u01bc\3\2\2\2\u0245\u01c5\3\2\2\2\u0245\u01cd\3\2"+
+               
"\2\2\u0245\u01d4\3\2\2\2\u0245\u01dd\3\2\2\2\u0245\u01e7\3\2\2\2\u0245"+
+               
"\u01f1\3\2\2\2\u0245\u01fb\3\2\2\2\u0245\u0207\3\2\2\2\u0245\u0213\3\2"+
+               
"\2\2\u0245\u021d\3\2\2\2\u0245\u0226\3\2\2\2\u0245\u022f\3\2\2\2\u0245"+
+               
"\u0234\3\2\2\2\u0245\u023a\3\2\2\2\u0246z\3\2\2\2\u0247\u0249\5\177@\2"+
+               
"\u0248\u0247\3\2\2\2\u0249\u024a\3\2\2\2\u024a\u0248\3\2\2\2\u024a\u024b"+
+               
"\3\2\2\2\u024b\u024d\3\2\2\2\u024c\u024e\t\2\2\2\u024d\u024c\3\2\2\2\u024d"+
+               
"\u024e\3\2\2\2\u024e|\3\2\2\2\u024f\u0251\5\177@\2\u0250\u024f\3\2\2\2"+
+               
"\u0251\u0252\3\2\2\2\u0252\u0250\3\2\2\2\u0252\u0253\3\2\2\2\u0253\u0254"+
+               
"\3\2\2\2\u0254\u0258\7\60\2\2\u0255\u0257\5\177@\2\u0256\u0255\3\2\2\2"+
+               
"\u0257\u025a\3\2\2\2\u0258\u0256\3\2\2\2\u0258\u0259\3\2\2\2\u0259\u025c"+
+               
"\3\2\2\2\u025a\u0258\3\2\2\2\u025b\u025d\5\u0083B\2\u025c\u025b\3\2\2"+
+               
"\2\u025c\u025d\3\2\2\2\u025d\u025f\3\2\2\2\u025e\u0260\t\2\2\2\u025f\u025e"+
+               
"\3\2\2\2\u025f\u0260\3\2\2\2\u0260\u0279\3\2\2\2\u0261\u0263\5\177@\2"+
+               
"\u0262\u0261\3\2\2\2\u0263\u0264\3\2\2\2\u0264\u0262\3\2\2\2\u0264\u0265"+
+               
"\3\2\2\2\u0265\u0267\3\2\2\2\u0266\u0268\5\u0083B\2\u0267\u0266\3\2\2"+
+               
"\2\u0267\u0268\3\2\2\2\u0268\u026a\3\2\2\2\u0269\u026b\t\2\2\2\u026a\u0269"+
+               
"\3\2\2\2\u026a\u026b\3\2\2\2\u026b\u0279\3\2\2\2\u026c\u026e\7\60\2\2"+
+               
"\u026d\u026f\5\177@\2\u026e\u026d\3\2\2\2\u026f\u0270\3\2\2\2\u0270\u026e"+
+               
"\3\2\2\2\u0270\u0271\3\2\2\2\u0271\u0273\3\2\2\2\u0272\u0274\5\u0083B"+
+               
"\2\u0273\u0272\3\2\2\2\u0273\u0274\3\2\2\2\u0274\u0276\3\2\2\2\u0275\u0277"+
+               
"\t\2\2\2\u0276\u0275\3\2\2\2\u0276\u0277\3\2\2\2\u0277\u0279\3\2\2\2\u0278"+
+               
"\u0250\3\2\2\2\u0278\u0262\3\2\2\2\u0278\u026c\3\2\2\2\u0279~\3\2\2\2"+
+               
"\u027a\u027b\4\62;\2\u027b\u0080\3\2\2\2\u027c\u027d\t\3\2\2\u027d\u0082"+
+               
"\3\2\2\2\u027e\u0280\t\4\2\2\u027f\u0281\t\5\2\2\u0280\u027f\3\2\2\2\u0280"+
+               
"\u0281\3\2\2\2\u0281\u0282\3\2\2\2\u0282\u0283\5{>\2\u0283\u0084\3\2\2"+
+               
"\2\u0284\u0285\7&\2\2\u0285\u028b\5\u0081A\2\u0286\u028a\5\u0081A\2\u0287"+
+               
"\u028a\5\177@\2\u0288\u028a\7a\2\2\u0289\u0286\3\2\2\2\u0289\u0287\3\2"+
+               
"\2\2\u0289\u0288\3\2\2\2\u028a\u028d\3\2\2\2\u028b\u0289\3\2\2\2\u028b"+
+               
"\u028c\3\2\2\2\u028c\u0086\3\2\2\2\u028d\u028b\3\2\2\2\u028e\u0290\7&"+
+               
"\2\2\u028f\u0291\5\177@\2\u0290\u028f\3\2\2\2\u0291\u0292\3\2\2\2\u0292"+
+               
"\u0290\3\2\2\2\u0292\u0293\3\2\2\2\u0293\u0088\3\2\2\2\u0294\u0299\7$"+
+               
"\2\2\u0295\u0298\5\u008bF\2\u0296\u0298\n\6\2\2\u0297\u0295\3\2\2\2\u0297"+
+               
"\u0296\3\2\2\2\u0298\u029b\3\2\2\2\u0299\u029a\3\2\2\2\u0299\u0297\3\2"+
+               
"\2\2\u029a\u029c\3\2\2\2\u029b\u0299\3\2\2\2\u029c\u02a7\7$\2\2\u029d"+
+               
"\u02a2\7)\2\2\u029e\u02a1\5\u008bF\2\u029f\u02a1\n\7\2\2\u02a0\u029e\3"+
+               
"\2\2\2\u02a0\u029f\3\2\2\2\u02a1\u02a4\3\2\2\2\u02a2\u02a3\3\2\2\2\u02a2"+
+               
"\u02a0\3\2\2\2\u02a3\u02a5\3\2\2\2\u02a4\u02a2\3\2\2\2\u02a5\u02a7\7)"+
+               
"\2\2\u02a6\u0294\3\2\2\2\u02a6\u029d\3\2\2\2\u02a7\u008a\3\2\2\2\u02a8"+
+               
"\u02a9\7^\2\2\u02a9\u02aa\t\b\2\2\u02aa\u008c\3\2\2\2\u02ab\u02af\7%\2"+
+               
"\2\u02ac\u02ae\13\2\2\2\u02ad\u02ac\3\2\2\2\u02ae\u02b1\3\2\2\2\u02af"+
+               
"\u02b0\3\2\2\2\u02af\u02ad\3\2\2\2\u02b0\u02b3\3\2\2\2\u02b1\u02af\3\2"+
+               
"\2\2\u02b2\u02b4\7\17\2\2\u02b3\u02b2\3\2\2\2\u02b3\u02b4\3\2\2\2\u02b4"+
+               
"\u02b5\3\2\2\2\u02b5\u02b6\7\f\2\2\u02b6\u02b7\3\2\2\2\u02b7\u02b8\bG"+
+               
"\2\2\u02b8\u008e\3\2\2\2\u02b9\u02ba\7\61\2\2\u02ba\u02bb\7,\2\2\u02bb"+
+               
"\u02bf\3\2\2\2\u02bc\u02be\13\2\2\2\u02bd\u02bc\3\2\2\2\u02be\u02c1\3"+
+               
"\2\2\2\u02bf\u02c0\3\2\2\2\u02bf\u02bd\3\2\2\2\u02c0\u02c2\3\2\2\2\u02c1"+
+               
"\u02bf\3\2\2\2\u02c2\u02c3\7,\2\2\u02c3\u02c4\7\61\2\2\u02c4\u02c5\3\2"+
+               
"\2\2\u02c5\u02c6\bH\2\2\u02c6\u0090\3\2\2\2\u02c7\u02c9\t\t\2\2\u02c8"+
+               
"\u02c7\3\2\2\2\u02c9\u02ca\3\2\2\2\u02ca\u02c8\3\2\2\2\u02ca\u02cb\3\2"+
+               
"\2\2\u02cb\u02cc\3\2\2\2\u02cc\u02cd\bI\2\2\u02cd\u0092\3\2\2\2#\2\u01a0"+
+               
"\u01a2\u01a8\u01ae\u01b0\u0245\u024a\u024d\u0252\u0258\u025c\u025f\u0264"+
+               
"\u0267\u026a\u0270\u0273\u0276\u0278\u0280\u0289\u028b\u0292\u0297\u0299"+
+               "\u02a0\u02a2\u02a6\u02af\u02b3\u02bf\u02ca\3\b\2\2";
        public static final ATN _ATN =
                new ATNDeserializer().deserialize(_serializedATN.toCharArray());
        static {
diff --git 
a/src/main/java/org/apache/sysds/runtime/instructions/CPInstructionParser.java 
b/src/main/java/org/apache/sysds/runtime/instructions/CPInstructionParser.java
index 6ffac46bf1..b53c954fd8 100644
--- 
a/src/main/java/org/apache/sysds/runtime/instructions/CPInstructionParser.java
+++ 
b/src/main/java/org/apache/sysds/runtime/instructions/CPInstructionParser.java
@@ -22,6 +22,7 @@ package org.apache.sysds.runtime.instructions;
 import java.util.HashMap;
 
 import org.apache.sysds.common.Types.ExecType;
+import org.apache.sysds.common.Types.OpOp1;
 import org.apache.sysds.hops.FunctionOp;
 import org.apache.sysds.lops.Append;
 import org.apache.sysds.lops.Compression;
@@ -30,7 +31,6 @@ import org.apache.sysds.lops.DeCompression;
 import org.apache.sysds.lops.LeftIndex;
 import org.apache.sysds.lops.Local;
 import org.apache.sysds.lops.RightIndex;
-import org.apache.sysds.lops.UnaryCP;
 import org.apache.sysds.runtime.DMLRuntimeException;
 import org.apache.sysds.runtime.instructions.cp.AggregateBinaryCPInstruction;
 import org.apache.sysds.runtime.instructions.cp.AggregateTernaryCPInstruction;
@@ -243,12 +243,13 @@ public class CPInstructionParser extends InstructionParser
                String2CPInstructionType.put( "mvvar"       , CPType.Variable);
                String2CPInstructionType.put( "rmvar"       , CPType.Variable);
                String2CPInstructionType.put( "rmfilevar"   , CPType.Variable);
-               String2CPInstructionType.put( UnaryCP.CAST_AS_SCALAR_OPCODE, 
CPType.Variable);
-               String2CPInstructionType.put( UnaryCP.CAST_AS_MATRIX_OPCODE, 
CPType.Variable);
-               String2CPInstructionType.put( UnaryCP.CAST_AS_FRAME_OPCODE,  
CPType.Variable);
-               String2CPInstructionType.put( UnaryCP.CAST_AS_DOUBLE_OPCODE, 
CPType.Variable);
-               String2CPInstructionType.put( UnaryCP.CAST_AS_INT_OPCODE,    
CPType.Variable);
-               String2CPInstructionType.put( UnaryCP.CAST_AS_BOOLEAN_OPCODE, 
CPType.Variable);
+               String2CPInstructionType.put( OpOp1.CAST_AS_SCALAR.toString(),  
CPType.Variable);
+               String2CPInstructionType.put( OpOp1.CAST_AS_MATRIX.toString(),  
CPType.Variable);
+               String2CPInstructionType.put( OpOp1.CAST_AS_FRAME.toString(),   
CPType.Variable);
+               String2CPInstructionType.put( OpOp1.CAST_AS_LIST.toString(),    
CPType.Variable);
+               String2CPInstructionType.put( OpOp1.CAST_AS_DOUBLE.toString(),  
CPType.Variable);
+               String2CPInstructionType.put( OpOp1.CAST_AS_INT.toString(),     
CPType.Variable);
+               String2CPInstructionType.put( OpOp1.CAST_AS_BOOLEAN.toString(), 
CPType.Variable);
                String2CPInstructionType.put( "attachfiletovar"  , 
CPType.Variable);
                String2CPInstructionType.put( "read"        , CPType.Variable);
                String2CPInstructionType.put( "write"       , CPType.Variable);
diff --git 
a/src/main/java/org/apache/sysds/runtime/instructions/cp/VariableCPInstruction.java
 
b/src/main/java/org/apache/sysds/runtime/instructions/cp/VariableCPInstruction.java
index c4cf00a58f..08e8e3f741 100644
--- 
a/src/main/java/org/apache/sysds/runtime/instructions/cp/VariableCPInstruction.java
+++ 
b/src/main/java/org/apache/sysds/runtime/instructions/cp/VariableCPInstruction.java
@@ -29,11 +29,11 @@ import org.apache.commons.lang3.tuple.Pair;
 import org.apache.sysds.api.DMLScript;
 import org.apache.sysds.common.Types.DataType;
 import org.apache.sysds.common.Types.FileFormat;
+import org.apache.sysds.common.Types.OpOp1;
 import org.apache.sysds.common.Types.ValueType;
 import org.apache.sysds.conf.CompilerConfig.ConfigType;
 import org.apache.sysds.conf.ConfigurationManager;
 import org.apache.sysds.lops.Lop;
-import org.apache.sysds.lops.UnaryCP;
 import org.apache.sysds.runtime.DMLRuntimeException;
 import org.apache.sysds.runtime.controlprogram.caching.CacheableData;
 import org.apache.sysds.runtime.controlprogram.caching.FrameObject;
@@ -88,8 +88,7 @@ public class VariableCPInstruction extends CPInstruction 
implements LineageTrace
         *      createvar x FP [dimensions] [formatinfo]
         */
 
-       public enum VariableOperationCode
-       {
+       public enum VariableOperationCode {
                CreateVariable,
                AssignVariable,
                CopyVariable,
@@ -99,6 +98,7 @@ public class VariableCPInstruction extends CPInstruction 
implements LineageTrace
                CastAsScalarVariable,
                CastAsMatrixVariable,
                CastAsFrameVariable,
+               CastAsListVariable,
                CastAsDoubleVariable,
                CastAsIntegerVariable,
                CastAsBooleanVariable,
@@ -178,22 +178,19 @@ public class VariableCPInstruction extends CPInstruction 
implements LineageTrace
                else if ( str.equalsIgnoreCase("rmfilevar") )
                        return VariableOperationCode.RemoveVariableAndFile;
 
-               else if ( str.equalsIgnoreCase(UnaryCP.CAST_AS_SCALAR_OPCODE) )
+               else if ( str.equalsIgnoreCase(OpOp1.CAST_AS_SCALAR.toString()) 
)
                        return VariableOperationCode.CastAsScalarVariable;
-
-               else if ( str.equalsIgnoreCase(UnaryCP.CAST_AS_MATRIX_OPCODE) )
+               else if ( str.equalsIgnoreCase(OpOp1.CAST_AS_MATRIX.toString()) 
)
                        return VariableOperationCode.CastAsMatrixVariable;
-
-               else if ( str.equalsIgnoreCase(UnaryCP.CAST_AS_FRAME_OPCODE) )
+               else if ( str.equalsIgnoreCase(OpOp1.CAST_AS_FRAME.toString()) )
                        return VariableOperationCode.CastAsFrameVariable;
-
-               else if ( str.equalsIgnoreCase(UnaryCP.CAST_AS_DOUBLE_OPCODE) )
+               else if ( str.equalsIgnoreCase(OpOp1.CAST_AS_LIST.toString()) )
+                       return VariableOperationCode.CastAsListVariable;
+               else if ( str.equalsIgnoreCase(OpOp1.CAST_AS_DOUBLE.toString()) 
)
                        return VariableOperationCode.CastAsDoubleVariable;
-
-               else if ( str.equalsIgnoreCase(UnaryCP.CAST_AS_INT_OPCODE) )
+               else if ( str.equalsIgnoreCase(OpOp1.CAST_AS_INT.toString()) )
                        return VariableOperationCode.CastAsIntegerVariable;
-
-               else if ( str.equalsIgnoreCase(UnaryCP.CAST_AS_BOOLEAN_OPCODE) )
+               else if ( 
str.equalsIgnoreCase(OpOp1.CAST_AS_BOOLEAN.toString()) )
                        return VariableOperationCode.CastAsBooleanVariable;
 
                else if ( str.equalsIgnoreCase("write") )
@@ -512,6 +509,7 @@ public class VariableCPInstruction extends CPInstruction 
implements LineageTrace
                case CastAsScalarVariable:
                case CastAsMatrixVariable:
                case CastAsFrameVariable:
+               case CastAsListVariable:
                case CastAsDoubleVariable:
                case CastAsIntegerVariable:
                case CastAsBooleanVariable:
@@ -609,6 +607,14 @@ public class VariableCPInstruction extends CPInstruction 
implements LineageTrace
                        processCastAsFrameVariableInstruction(ec);
                        break;
 
+               case CastAsListVariable:
+                       ListObject lobj = ec.getListObject(getInput1());
+                       if( lobj.getLength() != 1 || !(lobj.getData(0) 
instanceof ListObject) )
+                               throw new RuntimeException("as.list() expects a 
list input with one nested list: "
+                                       + "length(list)="+lobj.getLength()+", 
dt(list[0])="+lobj.getData(0).getDataType() );
+                       ec.setVariable(output.getName(), lobj.getData(0));
+                       break;
+
                case CastAsDoubleVariable:
                        ScalarObject scalarDoubleInput = 
ec.getScalarInput(getInput1());
                        ec.setScalarOutput(output.getName(), 
ScalarObjectFactory.castToDouble(scalarDoubleInput));
@@ -856,7 +862,7 @@ public class VariableCPInstruction extends CPInstruction 
implements LineageTrace
 
        /**
         * Handler for CastAsMatrixVariable instruction
-   *
+        *
         * @param ec execution context
         */
        private void processCastAsMatrixVariableInstruction(ExecutionContext 
ec) {
diff --git 
a/src/main/java/org/apache/sysds/runtime/instructions/fed/CastFEDInstruction.java
 
b/src/main/java/org/apache/sysds/runtime/instructions/fed/CastFEDInstruction.java
index 5fd53e0454..5c29d13128 100644
--- 
a/src/main/java/org/apache/sysds/runtime/instructions/fed/CastFEDInstruction.java
+++ 
b/src/main/java/org/apache/sysds/runtime/instructions/fed/CastFEDInstruction.java
@@ -26,8 +26,8 @@ import java.util.Map;
 
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.sysds.common.Types;
+import org.apache.sysds.common.Types.OpOp1;
 import org.apache.sysds.common.Types.ValueType;
-import org.apache.sysds.lops.UnaryCP;
 import org.apache.sysds.runtime.DMLRuntimeException;
 import org.apache.sysds.runtime.controlprogram.caching.FrameObject;
 import org.apache.sysds.runtime.controlprogram.caching.MatrixObject;
@@ -59,9 +59,9 @@ public class CastFEDInstruction extends UnaryFEDInstruction {
 
        @Override
        public void processInstruction(ExecutionContext ec) {
-               if(getOpcode().equals(UnaryCP.CAST_AS_MATRIX_OPCODE))
+               if(getOpcode().equals(OpOp1.CAST_AS_MATRIX.toString()))
                        processCastAsMatrixVariableInstruction(ec);
-               else if(getOpcode().equals(UnaryCP.CAST_AS_FRAME_OPCODE))
+               else if(getOpcode().equals(OpOp1.CAST_AS_FRAME.toString()))
                        processCastAsFrameVariableInstruction(ec);
                else
                        throw new DMLRuntimeException("Unsupported Opcode for 
federated Variable Instruction : " + getOpcode());
diff --git 
a/src/main/java/org/apache/sysds/runtime/instructions/fed/FEDInstructionUtils.java
 
b/src/main/java/org/apache/sysds/runtime/instructions/fed/FEDInstructionUtils.java
index fc6e651905..584f293021 100644
--- 
a/src/main/java/org/apache/sysds/runtime/instructions/fed/FEDInstructionUtils.java
+++ 
b/src/main/java/org/apache/sysds/runtime/instructions/fed/FEDInstructionUtils.java
@@ -20,8 +20,8 @@
 package org.apache.sysds.runtime.instructions.fed;
 
 import org.apache.commons.lang3.ArrayUtils;
+import org.apache.sysds.common.Types.OpOp1;
 import org.apache.sysds.hops.fedplanner.FTypes.FType;
-import org.apache.sysds.lops.UnaryCP;
 import org.apache.sysds.runtime.codegen.SpoofCellwise;
 import org.apache.sysds.runtime.codegen.SpoofMultiAggregate;
 import org.apache.sysds.runtime.codegen.SpoofOuterProduct;
@@ -293,7 +293,8 @@ public class FEDInstructionUtils {
                FEDInstruction fedinst = null;
                if(inst instanceof CastSPInstruction){
                        CastSPInstruction ins = (CastSPInstruction) inst;
-                       
if((ins.getOpcode().equalsIgnoreCase(UnaryCP.CAST_AS_FRAME_OPCODE) || 
ins.getOpcode().equalsIgnoreCase(UnaryCP.CAST_AS_MATRIX_OPCODE))
+                       
if((ins.getOpcode().equalsIgnoreCase(OpOp1.CAST_AS_FRAME.toString())
+                                       || 
ins.getOpcode().equalsIgnoreCase(OpOp1.CAST_AS_MATRIX.toString()))
                                && ins.input1.isMatrix() && 
ec.getCacheableData(ins.input1).isFederatedExcept(FType.BROADCAST)){
                                fedinst = 
CastFEDInstruction.parseInstruction(ins.getInstructionString());
                        }
diff --git 
a/src/main/java/org/apache/sysds/runtime/instructions/spark/CastSPInstruction.java
 
b/src/main/java/org/apache/sysds/runtime/instructions/spark/CastSPInstruction.java
index cb793fcf4c..36f5e7d225 100644
--- 
a/src/main/java/org/apache/sysds/runtime/instructions/spark/CastSPInstruction.java
+++ 
b/src/main/java/org/apache/sysds/runtime/instructions/spark/CastSPInstruction.java
@@ -21,9 +21,9 @@ package org.apache.sysds.runtime.instructions.spark;
 
 import org.apache.spark.api.java.JavaPairRDD;
 import org.apache.sysds.common.Types.FileFormat;
+import org.apache.sysds.common.Types.OpOp1;
 import org.apache.sysds.common.Types.ValueType;
 import org.apache.sysds.conf.ConfigurationManager;
-import org.apache.sysds.lops.UnaryCP;
 import org.apache.sysds.runtime.DMLRuntimeException;
 import org.apache.sysds.runtime.controlprogram.context.ExecutionContext;
 import org.apache.sysds.runtime.controlprogram.context.SparkExecutionContext;
@@ -65,13 +65,13 @@ public class CastSPInstruction extends UnarySPInstruction {
                JavaPairRDD<?,?> out = null;
                
                //convert frame-matrix / matrix-frame and set output
-               if( opcode.equals(UnaryCP.CAST_AS_MATRIX_OPCODE) ) {
+               if( opcode.equals(OpOp1.CAST_AS_MATRIX.toString()) ) {
                        DataCharacteristics mcOut = new 
MatrixCharacteristics(mcIn);
                        mcOut.setBlocksize(ConfigurationManager.getBlocksize());
                        out = FrameRDDConverterUtils.binaryBlockToMatrixBlock(
                                (JavaPairRDD<Long, FrameBlock>)in, mcIn, mcOut);
                }
-               else if( opcode.equals(UnaryCP.CAST_AS_FRAME_OPCODE) ) {
+               else if( opcode.equals(OpOp1.CAST_AS_FRAME.toString()) ) {
                        out = 
FrameRDDConverterUtils.matrixBlockToBinaryBlockLongIndex(sec.getSparkContext(), 
                                (JavaPairRDD<MatrixIndexes, MatrixBlock>)in, 
mcIn);
                }
@@ -85,7 +85,7 @@ public class CastSPInstruction extends UnarySPInstruction {
                sec.addLineageRDD(output.getName(), input1.getName());
                
                //update schema information for output frame
-               if( opcode.equals(UnaryCP.CAST_AS_FRAME_OPCODE) ) {
+               if( opcode.equals(OpOp1.CAST_AS_FRAME.toString()) ) {
                        sec.getFrameObject(output.getName()).setSchema(
                                UtilFunctions.nCopies((int)mcIn.getCols(), 
ValueType.FP64));
                }
diff --git 
a/src/main/java/org/apache/sysds/runtime/lineage/LineageItemUtils.java 
b/src/main/java/org/apache/sysds/runtime/lineage/LineageItemUtils.java
index 4955684f4e..c5e60ffa01 100644
--- a/src/main/java/org/apache/sysds/runtime/lineage/LineageItemUtils.java
+++ b/src/main/java/org/apache/sysds/runtime/lineage/LineageItemUtils.java
@@ -31,6 +31,7 @@ import 
org.apache.sysds.runtime.lineage.LineageItem.LineageItemType;
 import org.apache.sysds.api.DMLScript;
 import org.apache.sysds.common.Types.AggOp;
 import org.apache.sysds.common.Types.Direction;
+import org.apache.sysds.common.Types.OpOp1;
 import org.apache.sysds.hops.AggBinaryOp;
 import org.apache.sysds.hops.AggUnaryOp;
 import org.apache.sysds.hops.BinaryOp;
@@ -43,7 +44,6 @@ import org.apache.sysds.hops.TernaryOp;
 import org.apache.sysds.hops.UnaryOp;
 import org.apache.sysds.hops.codegen.SpoofFusedOp;
 import org.apache.sysds.lops.PartialAggregate;
-import org.apache.sysds.lops.UnaryCP;
 import org.apache.sysds.lops.compile.Dag;
 import org.apache.sysds.runtime.DMLRuntimeException;
 import org.apache.sysds.runtime.controlprogram.caching.CacheableData;
@@ -192,7 +192,7 @@ public class LineageItemUtils {
                        LineageItem out = operands.get(roots[0].getHopID());
                        if( roots.length > 1 ) { //multi-agg
                                LineageItem[] outputs = Arrays.stream(roots)
-                                       .map(h -> new LineageItem("", 
UnaryCP.CAST_AS_MATRIX_OPCODE,
+                                       .map(h -> new LineageItem("", 
OpOp1.CAST_AS_MATRIX.toString(),
                                                new 
LineageItem[]{operands.get(h.getHopID())}))
                                        .toArray(LineageItem[]::new);
                                out = new LineageItem("", "cbind", outputs);
diff --git 
a/src/test/java/org/apache/sysds/test/functions/misc/ListAppendSizeTest.java 
b/src/test/java/org/apache/sysds/test/functions/misc/ListAppendSizeTest.java
index c79753ab5a..54dd0e01d2 100644
--- a/src/test/java/org/apache/sysds/test/functions/misc/ListAppendSizeTest.java
+++ b/src/test/java/org/apache/sysds/test/functions/misc/ListAppendSizeTest.java
@@ -20,7 +20,6 @@
 package org.apache.sysds.test.functions.misc;
 
 import org.junit.Assert;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.apache.sysds.runtime.matrix.data.MatrixValue.CellIndex;
 import org.apache.sysds.common.Types.ExecMode;
@@ -64,7 +63,6 @@ public class ListAppendSizeTest extends AutomatedTestBase
        }
        
        @Test
-       @Ignore //TODO support for as.list unnesting
        public void testListAppendSize4CP() {
                runListAppendSize(TEST_NAME4, ExecType.CP, 4);
        }
diff --git 
a/src/test/java/org/apache/sysds/test/functions/recompile/LiteralReplaceCastScalarReadTest.java
 
b/src/test/java/org/apache/sysds/test/functions/recompile/LiteralReplaceCastScalarReadTest.java
index f1b0aee4f6..a9735c6dbf 100644
--- 
a/src/test/java/org/apache/sysds/test/functions/recompile/LiteralReplaceCastScalarReadTest.java
+++ 
b/src/test/java/org/apache/sysds/test/functions/recompile/LiteralReplaceCastScalarReadTest.java
@@ -22,10 +22,10 @@ package org.apache.sysds.test.functions.recompile;
 import org.junit.Assert;
 import org.junit.Test;
 import org.apache.sysds.hops.OptimizerUtils;
-import org.apache.sysds.lops.UnaryCP;
 import org.apache.sysds.test.AutomatedTestBase;
 import org.apache.sysds.test.TestConfiguration;
 import org.apache.sysds.test.TestUtils;
+import org.apache.sysds.common.Types.OpOp1;
 import org.apache.sysds.common.Types.ValueType;
 import org.apache.sysds.utils.Statistics;
 
@@ -84,9 +84,9 @@ public class LiteralReplaceCastScalarReadTest extends 
AutomatedTestBase
                        runTest(true, false, null, -1); 
                
                        //CHECK cast replacement and sum replacement
-                       Assert.assertEquals(false, 
Statistics.getCPHeavyHitterOpCodes().contains(UnaryCP.CAST_AS_INT_OPCODE));
-                       Assert.assertEquals(false, 
Statistics.getCPHeavyHitterOpCodes().contains(UnaryCP.CAST_AS_DOUBLE_OPCODE));
-                       Assert.assertEquals(false, 
Statistics.getCPHeavyHitterOpCodes().contains(UnaryCP.CAST_AS_BOOLEAN_OPCODE));
+                       Assert.assertEquals(false, 
Statistics.getCPHeavyHitterOpCodes().contains(OpOp1.CAST_AS_INT.toString()));
+                       Assert.assertEquals(false, 
Statistics.getCPHeavyHitterOpCodes().contains(OpOp1.CAST_AS_DOUBLE.toString()));
+                       Assert.assertEquals(false, 
Statistics.getCPHeavyHitterOpCodes().contains(OpOp1.CAST_AS_BOOLEAN.toString()));
                        Assert.assertEquals(false, 
Statistics.getCPHeavyHitterOpCodes().contains("uak+")); //sum
                }
                finally {
diff --git a/src/test/scripts/functions/misc/ListAppendSize4.dml 
b/src/test/scripts/functions/misc/ListAppendSize4.dml
index 0720051f77..05e3d97363 100644
--- a/src/test/scripts/functions/misc/ListAppendSize4.dml
+++ b/src/test/scripts/functions/misc/ListAppendSize4.dml
@@ -22,11 +22,8 @@
 l1 = list(1, 2, 3)
 l2 = list()
 l2 = append(l2, l1)
-l3 = as.list(l2[1]) # TODO
+l3 = as.list(l2[1])
 l4 = append(l3, 12)
-
-print(toString(l4))
-print(length(l4))
-
 S = as.matrix(length(l4))
+
 write(S, $1)

Reply via email to