You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@systemds.apache.org by mb...@apache.org on 2022/05/08 16:39:24 UTC

[systemds] branch main updated: [SYSTEMDS-3370] Fix missing support for list unnesting

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 <mb...@gmail.com>
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)