You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by xu...@apache.org on 2017/12/20 01:21:13 UTC

[1/3] hive git commit: HIVE-18159: Vectorization: Support Map type in MapWork (Colin Ma, reviewed by Ferdinand Xu)

Repository: hive
Updated Branches:
  refs/heads/master 14df3b021 -> a6fab1438


http://git-wip-us.apache.org/repos/asf/hive/blob/a6fab143/ql/src/test/results/clientpositive/parquet_map_type_vectorization.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/parquet_map_type_vectorization.q.out b/ql/src/test/results/clientpositive/parquet_map_type_vectorization.q.out
new file mode 100644
index 0000000..af9754e
--- /dev/null
+++ b/ql/src/test/results/clientpositive/parquet_map_type_vectorization.q.out
@@ -0,0 +1,484 @@
+PREHOOK: query: DROP TABLE parquet_map_type_staging
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE parquet_map_type_staging
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: DROP TABLE parquet_map_type
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE parquet_map_type
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE parquet_map_type_staging (
+id int,
+stringMap map<string, string>,
+intMap map<int, int>,
+doubleMap map<double, double>,
+stringIndex string,
+intIndex int,
+doubleIndex double
+) ROW FORMAT DELIMITED
+  FIELDS TERMINATED BY '|'
+  COLLECTION ITEMS TERMINATED BY ','
+  MAP KEYS TERMINATED BY ':'
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@parquet_map_type_staging
+POSTHOOK: query: CREATE TABLE parquet_map_type_staging (
+id int,
+stringMap map<string, string>,
+intMap map<int, int>,
+doubleMap map<double, double>,
+stringIndex string,
+intIndex int,
+doubleIndex double
+) ROW FORMAT DELIMITED
+  FIELDS TERMINATED BY '|'
+  COLLECTION ITEMS TERMINATED BY ','
+  MAP KEYS TERMINATED BY ':'
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@parquet_map_type_staging
+PREHOOK: query: CREATE TABLE parquet_map_type (
+id int,
+stringMap map<string, string>,
+intMap map<int, int>,
+doubleMap map<double, double>,
+stringIndex string,
+intIndex int,
+doubleIndex double
+) STORED AS PARQUET
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@parquet_map_type
+POSTHOOK: query: CREATE TABLE parquet_map_type (
+id int,
+stringMap map<string, string>,
+intMap map<int, int>,
+doubleMap map<double, double>,
+stringIndex string,
+intIndex int,
+doubleIndex double
+) STORED AS PARQUET
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@parquet_map_type
+PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/parquet_vector_map_type.txt' OVERWRITE INTO TABLE parquet_map_type_staging
+PREHOOK: type: LOAD
+#### A masked pattern was here ####
+PREHOOK: Output: default@parquet_map_type_staging
+POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/parquet_vector_map_type.txt' OVERWRITE INTO TABLE parquet_map_type_staging
+POSTHOOK: type: LOAD
+#### A masked pattern was here ####
+POSTHOOK: Output: default@parquet_map_type_staging
+PREHOOK: query: INSERT OVERWRITE TABLE parquet_map_type
+SELECT id, stringMap, intMap, doubleMap, stringIndex, intIndex, doubleIndex FROM parquet_map_type_staging where id < 1024
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type_staging
+PREHOOK: Output: default@parquet_map_type
+POSTHOOK: query: INSERT OVERWRITE TABLE parquet_map_type
+SELECT id, stringMap, intMap, doubleMap, stringIndex, intIndex, doubleIndex FROM parquet_map_type_staging where id < 1024
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type_staging
+POSTHOOK: Output: default@parquet_map_type
+POSTHOOK: Lineage: parquet_map_type.doubleindex SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:doubleindex, type:double, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.doublemap SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:doublemap, type:map<double,double>, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.id SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:id, type:int, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.intindex SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:intindex, type:int, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.intmap SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:intmap, type:map<int,int>, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.stringindex SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:stringindex, type:string, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.stringmap SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:stringmap, type:map<string,string>, comment:null), ]
+PREHOOK: query: select count(*) from parquet_map_type
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+POSTHOOK: query: select count(*) from parquet_map_type
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+1023
+PREHOOK: query: explain vectorization expression select stringMap, intMap, doubleMap, stringMap['k2'], intMap[456],
+doubleMap[123.123], stringMap[stringIndex], intMap[intIndex], doubleMap[doubleIndex] from parquet_map_type limit 10
+PREHOOK: type: QUERY
+POSTHOOK: query: explain vectorization expression select stringMap, intMap, doubleMap, stringMap['k2'], intMap[456],
+doubleMap[123.123], stringMap[stringIndex], intMap[intIndex], doubleMap[doubleIndex] from parquet_map_type limit 10
+POSTHOOK: type: QUERY
+PLAN VECTORIZATION:
+  enabled: true
+  enabledConditionsMet: [hive.vectorized.execution.enabled IS true]
+
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 depends on stages: Stage-1
+
+STAGE PLANS:
+  Stage: Stage-1
+    Map Reduce
+      Map Operator Tree:
+          TableScan
+            alias: parquet_map_type
+            Statistics: Num rows: 1023 Data size: 7161 Basic stats: COMPLETE Column stats: NONE
+            TableScan Vectorization:
+                native: true
+            Select Operator
+              expressions: stringmap (type: map<string,string>), intmap (type: map<int,int>), doublemap (type: map<double,double>), stringmap['k2'] (type: string), intmap[456] (type: int), doublemap[123.123] (type: double), stringmap[stringindex] (type: string), intmap[intindex] (type: int), doublemap[doubleindex] (type: double)
+              outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8
+              Select Vectorization:
+                  className: VectorSelectOperator
+                  native: true
+                  projectedOutputColumnNums: [1, 2, 3, 8, 9, 10, 11, 12, 13]
+                  selectExpressions: VectorUDFMapIndexStringScalar(col 1:map<string,string>, key: k2) -> 8:string, VectorUDFMapIndexLongScalar(col 2:map<int,int>, key: 456) -> 9:int, VectorUDFMapIndexDoubleScalar(col 3:map<double,double>, key: 123.123) -> 10:double, VectorUDFMapIndexStringCol(col 1:map<string,string>, key: col 4:string) -> 11:string, VectorUDFMapIndexLongCol(col 2:map<int,int>, key: col 5:int) -> 12:int, VectorUDFMapIndexDoubleCol(col 3:map<double,double>, key: col 6:double) -> 13:double
+              Statistics: Num rows: 1023 Data size: 7161 Basic stats: COMPLETE Column stats: NONE
+              Limit
+                Number of rows: 10
+                Limit Vectorization:
+                    className: VectorLimitOperator
+                    native: true
+                Statistics: Num rows: 10 Data size: 70 Basic stats: COMPLETE Column stats: NONE
+                File Output Operator
+                  compressed: false
+                  File Sink Vectorization:
+                      className: VectorFileSinkOperator
+                      native: false
+                  Statistics: Num rows: 10 Data size: 70 Basic stats: COMPLETE Column stats: NONE
+                  table:
+                      input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+                      output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+                      serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+      Execution mode: vectorized
+      Map Vectorization:
+          enabled: true
+          enabledConditionsMet: hive.vectorized.use.vectorized.input.format IS true
+          inputFormatFeatureSupport: []
+          featureSupportInUse: []
+          inputFileFormats: org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat
+          allNative: false
+          usesVectorUDFAdaptor: false
+          vectorized: true
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: 10
+      Processor Tree:
+        ListSink
+
+PREHOOK: query: select stringMap, intMap, doubleMap, stringMap['k2'], intMap[456], doubleMap[123.123],
+stringMap[stringIndex], intMap[intIndex], doubleMap[doubleIndex] from parquet_map_type limit 10
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+POSTHOOK: query: select stringMap, intMap, doubleMap, stringMap['k2'], intMap[456], doubleMap[123.123],
+stringMap[stringIndex], intMap[intIndex], doubleMap[doubleIndex] from parquet_map_type limit 10
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+{"k1":"v1","k2":"v1-2"}	{456:2,123:1}	{123.123:1.1,456.456:1.2}	v1-2	2	1.1	v1	1	1.2
+{"k1":"v2","k2":"v2-2"}	{456:4,123:3}	{123.123:2.1,456.456:2.2}	v2-2	4	2.1	v2	3	2.2
+{"k1":"v3","k2":"v3-2"}	{456:6,123:5}	{123.123:3.1,456.456:3.2}	v3-2	6	3.1	v3	5	3.2
+{"k1":"v4","k2":"v4-2"}	{456:8,123:7}	{123.123:4.1,456.456:4.2}	v4-2	8	4.1	v4	7	4.2
+{"k1":"v5","k2":"v5-2"}	{456:10,123:9}	{123.123:5.1,456.456:5.2}	v5-2	10	5.1	v5	9	5.2
+{"k1":"v6","k2":"v6-2"}	{456:12,123:11}	{123.123:6.1,456.456:6.2}	v6-2	12	6.1	v6	11	6.2
+{"k1":"v7","k2":"v7-2"}	{456:14,123:13}	{123.123:7.1,456.456:7.2}	v7-2	14	7.1	v7	13	7.2
+{"k1":"v8","k2":"v8-2"}	{456:16,123:15}	{123.123:8.1,456.456:8.2}	v8-2	16	8.1	v8	15	8.2
+{"k1":"v9","k2":"v9-2"}	{456:18,123:17}	{123.123:9.1,456.456:9.2}	v9-2	18	9.1	v9	17	9.2
+{"k1":"v10","k2":"v10-2"}	{456:20,123:19}	{123.123:10.1,456.456:10.2}	v10-2	20	10.1	v10	19	10.2
+PREHOOK: query: explain vectorization expression select sum(intMap[123]), sum(doubleMap[123.123]), stringMap['k1']
+from parquet_map_type where stringMap['k1'] like 'v100%' group by stringMap['k1'] order by stringMap['k1'] limit 10
+PREHOOK: type: QUERY
+POSTHOOK: query: explain vectorization expression select sum(intMap[123]), sum(doubleMap[123.123]), stringMap['k1']
+from parquet_map_type where stringMap['k1'] like 'v100%' group by stringMap['k1'] order by stringMap['k1'] limit 10
+POSTHOOK: type: QUERY
+PLAN VECTORIZATION:
+  enabled: true
+  enabledConditionsMet: [hive.vectorized.execution.enabled IS true]
+
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-2 depends on stages: Stage-1
+  Stage-0 depends on stages: Stage-2
+
+STAGE PLANS:
+  Stage: Stage-1
+    Map Reduce
+      Map Operator Tree:
+          TableScan
+            alias: parquet_map_type
+            Statistics: Num rows: 1023 Data size: 7161 Basic stats: COMPLETE Column stats: NONE
+            TableScan Vectorization:
+                native: true
+            Filter Operator
+              Filter Vectorization:
+                  className: VectorFilterOperator
+                  native: true
+                  predicateExpression: FilterStringColLikeStringScalar(col 8:string, pattern v100%)(children: VectorUDFMapIndexStringScalar(col 1:map<string,string>, key: k1) -> 8:string)
+              predicate: (stringmap['k1'] like 'v100%') (type: boolean)
+              Statistics: Num rows: 511 Data size: 3577 Basic stats: COMPLETE Column stats: NONE
+              Select Operator
+                expressions: stringmap['k1'] (type: string), intmap[123] (type: int), doublemap[123.123] (type: double)
+                outputColumnNames: _col0, _col1, _col2
+                Select Vectorization:
+                    className: VectorSelectOperator
+                    native: true
+                    projectedOutputColumnNums: [8, 9, 10]
+                    selectExpressions: VectorUDFMapIndexStringScalar(col 1:map<string,string>, key: k1) -> 8:string, VectorUDFMapIndexLongScalar(col 2:map<int,int>, key: 123) -> 9:int, VectorUDFMapIndexDoubleScalar(col 3:map<double,double>, key: 123.123) -> 10:double
+                Statistics: Num rows: 511 Data size: 3577 Basic stats: COMPLETE Column stats: NONE
+                Group By Operator
+                  aggregations: sum(_col1), sum(_col2)
+                  Group By Vectorization:
+                      aggregators: VectorUDAFSumLong(col 9:int) -> bigint, VectorUDAFSumDouble(col 10:double) -> double
+                      className: VectorGroupByOperator
+                      groupByMode: HASH
+                      keyExpressions: col 8:string
+                      native: false
+                      vectorProcessingMode: HASH
+                      projectedOutputColumnNums: [0, 1]
+                  keys: _col0 (type: string)
+                  mode: hash
+                  outputColumnNames: _col0, _col1, _col2
+                  Statistics: Num rows: 511 Data size: 3577 Basic stats: COMPLETE Column stats: NONE
+                  Reduce Output Operator
+                    key expressions: _col0 (type: string)
+                    sort order: +
+                    Map-reduce partition columns: _col0 (type: string)
+                    Reduce Sink Vectorization:
+                        className: VectorReduceSinkOperator
+                        native: false
+                        nativeConditionsMet: hive.vectorized.execution.reducesink.new.enabled IS true, No PTF TopN IS true, No DISTINCT columns IS true, BinarySortableSerDe for keys IS true, LazyBinarySerDe for values IS true
+                        nativeConditionsNotMet: hive.execution.engine mr IN [tez, spark] IS false
+                    Statistics: Num rows: 511 Data size: 3577 Basic stats: COMPLETE Column stats: NONE
+                    TopN Hash Memory Usage: 0.1
+                    value expressions: _col1 (type: bigint), _col2 (type: double)
+      Execution mode: vectorized
+      Map Vectorization:
+          enabled: true
+          enabledConditionsMet: hive.vectorized.use.vectorized.input.format IS true
+          inputFormatFeatureSupport: []
+          featureSupportInUse: []
+          inputFileFormats: org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat
+          allNative: false
+          usesVectorUDFAdaptor: false
+          vectorized: true
+      Reduce Vectorization:
+          enabled: false
+          enableConditionsMet: hive.vectorized.execution.reduce.enabled IS true
+          enableConditionsNotMet: hive.execution.engine mr IN [tez, spark] IS false
+      Reduce Operator Tree:
+        Group By Operator
+          aggregations: sum(VALUE._col0), sum(VALUE._col1)
+          keys: KEY._col0 (type: string)
+          mode: mergepartial
+          outputColumnNames: _col0, _col1, _col2
+          Statistics: Num rows: 255 Data size: 1785 Basic stats: COMPLETE Column stats: NONE
+          Select Operator
+            expressions: _col1 (type: bigint), _col2 (type: double), _col0 (type: string)
+            outputColumnNames: _col0, _col1, _col3
+            Statistics: Num rows: 255 Data size: 1785 Basic stats: COMPLETE Column stats: NONE
+            File Output Operator
+              compressed: false
+              table:
+                  input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+                  output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+                  serde: org.apache.hadoop.hive.serde2.lazybinary.LazyBinarySerDe
+
+  Stage: Stage-2
+    Map Reduce
+      Map Operator Tree:
+          TableScan
+            TableScan Vectorization:
+                native: true
+            Reduce Output Operator
+              key expressions: _col3 (type: string)
+              sort order: +
+              Reduce Sink Vectorization:
+                  className: VectorReduceSinkOperator
+                  native: false
+                  nativeConditionsMet: hive.vectorized.execution.reducesink.new.enabled IS true, No PTF TopN IS true, No DISTINCT columns IS true, BinarySortableSerDe for keys IS true, LazyBinarySerDe for values IS true
+                  nativeConditionsNotMet: hive.execution.engine mr IN [tez, spark] IS false
+              Statistics: Num rows: 255 Data size: 1785 Basic stats: COMPLETE Column stats: NONE
+              TopN Hash Memory Usage: 0.1
+              value expressions: _col0 (type: bigint), _col1 (type: double)
+      Execution mode: vectorized
+      Map Vectorization:
+          enabled: true
+          enabledConditionsMet: hive.vectorized.use.vector.serde.deserialize IS true
+          inputFormatFeatureSupport: []
+          featureSupportInUse: []
+          inputFileFormats: org.apache.hadoop.mapred.SequenceFileInputFormat
+          allNative: false
+          usesVectorUDFAdaptor: false
+          vectorized: true
+      Reduce Vectorization:
+          enabled: false
+          enableConditionsMet: hive.vectorized.execution.reduce.enabled IS true
+          enableConditionsNotMet: hive.execution.engine mr IN [tez, spark] IS false
+      Reduce Operator Tree:
+        Select Operator
+          expressions: VALUE._col0 (type: bigint), VALUE._col1 (type: double), KEY.reducesinkkey0 (type: string)
+          outputColumnNames: _col0, _col1, _col2
+          Statistics: Num rows: 255 Data size: 1785 Basic stats: COMPLETE Column stats: NONE
+          Limit
+            Number of rows: 10
+            Statistics: Num rows: 10 Data size: 70 Basic stats: COMPLETE Column stats: NONE
+            File Output Operator
+              compressed: false
+              Statistics: Num rows: 10 Data size: 70 Basic stats: COMPLETE Column stats: NONE
+              table:
+                  input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+                  output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+                  serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+      Processor Tree:
+        ListSink
+
+PREHOOK: query: select sum(intMap[123]), sum(doubleMap[123.123]), stringMap['k1']
+from parquet_map_type where stringMap['k1'] like 'v100%' group by stringMap['k1'] order by stringMap['k1'] limit 10
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+POSTHOOK: query: select sum(intMap[123]), sum(doubleMap[123.123]), stringMap['k1']
+from parquet_map_type where stringMap['k1'] like 'v100%' group by stringMap['k1'] order by stringMap['k1'] limit 10
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+199	100.1	v100
+1999	1000.1	v1000
+2001	1001.1	v1001
+2003	1002.1	v1002
+2005	1003.1	v1003
+2007	1004.1	v1004
+2009	1005.1	v1005
+2011	1006.1	v1006
+2013	1007.1	v1007
+2015	1008.1	v1008
+PREHOOK: query: INSERT OVERWRITE TABLE parquet_map_type
+SELECT id, stringMap, intMap, doubleMap, stringIndex, intIndex, doubleIndex FROM parquet_map_type_staging where id < 1025
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type_staging
+PREHOOK: Output: default@parquet_map_type
+POSTHOOK: query: INSERT OVERWRITE TABLE parquet_map_type
+SELECT id, stringMap, intMap, doubleMap, stringIndex, intIndex, doubleIndex FROM parquet_map_type_staging where id < 1025
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type_staging
+POSTHOOK: Output: default@parquet_map_type
+POSTHOOK: Lineage: parquet_map_type.doubleindex SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:doubleindex, type:double, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.doublemap SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:doublemap, type:map<double,double>, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.id SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:id, type:int, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.intindex SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:intindex, type:int, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.intmap SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:intmap, type:map<int,int>, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.stringindex SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:stringindex, type:string, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.stringmap SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:stringmap, type:map<string,string>, comment:null), ]
+PREHOOK: query: select count(*) from parquet_map_type
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+POSTHOOK: query: select count(*) from parquet_map_type
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+1024
+PREHOOK: query: select stringMap, intMap, doubleMap, stringMap['k2'], intMap[456], doubleMap[123.123],
+stringMap[stringIndex], intMap[intIndex], doubleMap[doubleIndex] from parquet_map_type limit 10
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+POSTHOOK: query: select stringMap, intMap, doubleMap, stringMap['k2'], intMap[456], doubleMap[123.123],
+stringMap[stringIndex], intMap[intIndex], doubleMap[doubleIndex] from parquet_map_type limit 10
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+{"k1":"v1","k2":"v1-2"}	{456:2,123:1}	{123.123:1.1,456.456:1.2}	v1-2	2	1.1	v1	1	1.2
+{"k1":"v2","k2":"v2-2"}	{456:4,123:3}	{123.123:2.1,456.456:2.2}	v2-2	4	2.1	v2	3	2.2
+{"k1":"v3","k2":"v3-2"}	{456:6,123:5}	{123.123:3.1,456.456:3.2}	v3-2	6	3.1	v3	5	3.2
+{"k1":"v4","k2":"v4-2"}	{456:8,123:7}	{123.123:4.1,456.456:4.2}	v4-2	8	4.1	v4	7	4.2
+{"k1":"v5","k2":"v5-2"}	{456:10,123:9}	{123.123:5.1,456.456:5.2}	v5-2	10	5.1	v5	9	5.2
+{"k1":"v6","k2":"v6-2"}	{456:12,123:11}	{123.123:6.1,456.456:6.2}	v6-2	12	6.1	v6	11	6.2
+{"k1":"v7","k2":"v7-2"}	{456:14,123:13}	{123.123:7.1,456.456:7.2}	v7-2	14	7.1	v7	13	7.2
+{"k1":"v8","k2":"v8-2"}	{456:16,123:15}	{123.123:8.1,456.456:8.2}	v8-2	16	8.1	v8	15	8.2
+{"k1":"v9","k2":"v9-2"}	{456:18,123:17}	{123.123:9.1,456.456:9.2}	v9-2	18	9.1	v9	17	9.2
+{"k1":"v10","k2":"v10-2"}	{456:20,123:19}	{123.123:10.1,456.456:10.2}	v10-2	20	10.1	v10	19	10.2
+PREHOOK: query: select sum(intMap[123]), sum(doubleMap[123.123]), stringMap['k1']
+from parquet_map_type where stringMap['k1'] like 'v100%' group by stringMap['k1'] order by stringMap['k1'] limit 10
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+POSTHOOK: query: select sum(intMap[123]), sum(doubleMap[123.123]), stringMap['k1']
+from parquet_map_type where stringMap['k1'] like 'v100%' group by stringMap['k1'] order by stringMap['k1'] limit 10
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+199	100.1	v100
+1999	1000.1	v1000
+2001	1001.1	v1001
+2003	1002.1	v1002
+2005	1003.1	v1003
+2007	1004.1	v1004
+2009	1005.1	v1005
+2011	1006.1	v1006
+2013	1007.1	v1007
+2015	1008.1	v1008
+PREHOOK: query: INSERT OVERWRITE TABLE parquet_map_type
+SELECT id, stringMap, intMap, doubleMap, stringIndex, intIndex, doubleIndex FROM parquet_map_type_staging
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type_staging
+PREHOOK: Output: default@parquet_map_type
+POSTHOOK: query: INSERT OVERWRITE TABLE parquet_map_type
+SELECT id, stringMap, intMap, doubleMap, stringIndex, intIndex, doubleIndex FROM parquet_map_type_staging
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type_staging
+POSTHOOK: Output: default@parquet_map_type
+POSTHOOK: Lineage: parquet_map_type.doubleindex SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:doubleindex, type:double, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.doublemap SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:doublemap, type:map<double,double>, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.id SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:id, type:int, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.intindex SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:intindex, type:int, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.intmap SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:intmap, type:map<int,int>, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.stringindex SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:stringindex, type:string, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.stringmap SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:stringmap, type:map<string,string>, comment:null), ]
+PREHOOK: query: select count(*) from parquet_map_type
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+POSTHOOK: query: select count(*) from parquet_map_type
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+1025
+PREHOOK: query: select stringMap, intMap, doubleMap, stringMap['k2'], intMap[456], doubleMap[123.123],
+stringMap[stringIndex], intMap[intIndex], doubleMap[doubleIndex] from parquet_map_type limit 10
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+POSTHOOK: query: select stringMap, intMap, doubleMap, stringMap['k2'], intMap[456], doubleMap[123.123],
+stringMap[stringIndex], intMap[intIndex], doubleMap[doubleIndex] from parquet_map_type limit 10
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+{"k1":"v1","k2":"v1-2"}	{456:2,123:1}	{123.123:1.1,456.456:1.2}	v1-2	2	1.1	v1	1	1.2
+{"k1":"v2","k2":"v2-2"}	{456:4,123:3}	{123.123:2.1,456.456:2.2}	v2-2	4	2.1	v2	3	2.2
+{"k1":"v3","k2":"v3-2"}	{456:6,123:5}	{123.123:3.1,456.456:3.2}	v3-2	6	3.1	v3	5	3.2
+{"k1":"v4","k2":"v4-2"}	{456:8,123:7}	{123.123:4.1,456.456:4.2}	v4-2	8	4.1	v4	7	4.2
+{"k1":"v5","k2":"v5-2"}	{456:10,123:9}	{123.123:5.1,456.456:5.2}	v5-2	10	5.1	v5	9	5.2
+{"k1":"v6","k2":"v6-2"}	{456:12,123:11}	{123.123:6.1,456.456:6.2}	v6-2	12	6.1	v6	11	6.2
+{"k1":"v7","k2":"v7-2"}	{456:14,123:13}	{123.123:7.1,456.456:7.2}	v7-2	14	7.1	v7	13	7.2
+{"k1":"v8","k2":"v8-2"}	{456:16,123:15}	{123.123:8.1,456.456:8.2}	v8-2	16	8.1	v8	15	8.2
+{"k1":"v9","k2":"v9-2"}	{456:18,123:17}	{123.123:9.1,456.456:9.2}	v9-2	18	9.1	v9	17	9.2
+{"k1":"v10","k2":"v10-2"}	{456:20,123:19}	{123.123:10.1,456.456:10.2}	v10-2	20	10.1	v10	19	10.2
+PREHOOK: query: select sum(intMap[123]), sum(doubleMap[123.123]), stringMap['k1']
+from parquet_map_type where stringMap['k1'] like 'v100%' group by stringMap['k1'] order by stringMap['k1'] limit 10
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+POSTHOOK: query: select sum(intMap[123]), sum(doubleMap[123.123]), stringMap['k1']
+from parquet_map_type where stringMap['k1'] like 'v100%' group by stringMap['k1'] order by stringMap['k1'] limit 10
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+199	100.1	v100
+1999	1000.1	v1000
+2001	1001.1	v1001
+2003	1002.1	v1002
+2005	1003.1	v1003
+2007	1004.1	v1004
+2009	1005.1	v1005
+2011	1006.1	v1006
+2013	1007.1	v1007
+2015	1008.1	v1008


[3/3] hive git commit: HIVE-18159: Vectorization: Support Map type in MapWork (Colin Ma, reviewed by Ferdinand Xu)

Posted by xu...@apache.org.
HIVE-18159: Vectorization: Support Map type in MapWork (Colin Ma, reviewed by Ferdinand Xu)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/a6fab143
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/a6fab143
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/a6fab143

Branch: refs/heads/master
Commit: a6fab1438865a113e98be1bb97fa0549d160a61d
Parents: 14df3b0
Author: Ferdinand Xu <ch...@intel.com>
Authored: Wed Dec 20 09:19:56 2017 +0800
Committer: Ferdinand Xu <ch...@intel.com>
Committed: Wed Dec 20 09:19:56 2017 +0800

----------------------------------------------------------------------
 data/files/parquet_vector_map_type.txt          | 1025 ++++++++++++++++++
 .../test/resources/testconfiguration.properties |    1 +
 .../exec/vector/VectorExpressionDescriptor.java |    5 +-
 .../ql/exec/vector/VectorizationContext.java    |    5 +
 .../expressions/VectorUDFMapIndexBase.java      |   89 ++
 .../expressions/VectorUDFMapIndexBaseCol.java   |  119 ++
 .../VectorUDFMapIndexBaseScalar.java            |   91 ++
 .../expressions/VectorUDFMapIndexDoubleCol.java |   63 ++
 .../VectorUDFMapIndexDoubleScalar.java          |   76 ++
 .../expressions/VectorUDFMapIndexLongCol.java   |   63 ++
 .../VectorUDFMapIndexLongScalar.java            |   70 ++
 .../expressions/VectorUDFMapIndexStringCol.java |   73 ++
 .../VectorUDFMapIndexStringScalar.java          |   80 ++
 .../hive/ql/udf/generic/GenericUDFIndex.java    |   11 +-
 .../parquet_map_type_vectorization.q            |   73 ++
 .../llap/parquet_map_type_vectorization.q.out   |  500 +++++++++
 .../parquet_map_type_vectorization.q.out        |  484 +++++++++
 17 files changed, 2826 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/a6fab143/data/files/parquet_vector_map_type.txt
----------------------------------------------------------------------
diff --git a/data/files/parquet_vector_map_type.txt b/data/files/parquet_vector_map_type.txt
new file mode 100644
index 0000000..4d17ba4
--- /dev/null
+++ b/data/files/parquet_vector_map_type.txt
@@ -0,0 +1,1025 @@
+1|k1:v1,k2:v1-2|123:1,456:2|123.123:1.1,456.456:1.2|k1|123|456.456
+2|k1:v2,k2:v2-2|123:3,456:4|123.123:2.1,456.456:2.2|k1|123|456.456
+3|k1:v3,k2:v3-2|123:5,456:6|123.123:3.1,456.456:3.2|k1|123|456.456
+4|k1:v4,k2:v4-2|123:7,456:8|123.123:4.1,456.456:4.2|k1|123|456.456
+5|k1:v5,k2:v5-2|123:9,456:10|123.123:5.1,456.456:5.2|k1|123|456.456
+6|k1:v6,k2:v6-2|123:11,456:12|123.123:6.1,456.456:6.2|k1|123|456.456
+7|k1:v7,k2:v7-2|123:13,456:14|123.123:7.1,456.456:7.2|k1|123|456.456
+8|k1:v8,k2:v8-2|123:15,456:16|123.123:8.1,456.456:8.2|k1|123|456.456
+9|k1:v9,k2:v9-2|123:17,456:18|123.123:9.1,456.456:9.2|k1|123|456.456
+10|k1:v10,k2:v10-2|123:19,456:20|123.123:10.1,456.456:10.2|k1|123|456.456
+11|k1:v11,k2:v11-2|123:21,456:22|123.123:11.1,456.456:11.2|k1|123|456.456
+12|k1:v12,k2:v12-2|123:23,456:24|123.123:12.1,456.456:12.2|k1|123|456.456
+13|k1:v13,k2:v13-2|123:25,456:26|123.123:13.1,456.456:13.2|k1|123|456.456
+14|k1:v14,k2:v14-2|123:27,456:28|123.123:14.1,456.456:14.2|k1|123|456.456
+15|k1:v15,k2:v15-2|123:29,456:30|123.123:15.1,456.456:15.2|k1|123|456.456
+16|k1:v16,k2:v16-2|123:31,456:32|123.123:16.1,456.456:16.2|k1|123|456.456
+17|k1:v17,k2:v17-2|123:33,456:34|123.123:17.1,456.456:17.2|k1|123|456.456
+18|k1:v18,k2:v18-2|123:35,456:36|123.123:18.1,456.456:18.2|k1|123|456.456
+19|k1:v19,k2:v19-2|123:37,456:38|123.123:19.1,456.456:19.2|k1|123|456.456
+20|k1:v20,k2:v20-2|123:39,456:40|123.123:20.1,456.456:20.2|k1|123|456.456
+21|k1:v21,k2:v21-2|123:41,456:42|123.123:21.1,456.456:21.2|k1|123|456.456
+22|k1:v22,k2:v22-2|123:43,456:44|123.123:22.1,456.456:22.2|k1|123|456.456
+23|k1:v23,k2:v23-2|123:45,456:46|123.123:23.1,456.456:23.2|k1|123|456.456
+24|k1:v24,k2:v24-2|123:47,456:48|123.123:24.1,456.456:24.2|k1|123|456.456
+25|k1:v25,k2:v25-2|123:49,456:50|123.123:25.1,456.456:25.2|k1|123|456.456
+26|k1:v26,k2:v26-2|123:51,456:52|123.123:26.1,456.456:26.2|k1|123|456.456
+27|k1:v27,k2:v27-2|123:53,456:54|123.123:27.1,456.456:27.2|k1|123|456.456
+28|k1:v28,k2:v28-2|123:55,456:56|123.123:28.1,456.456:28.2|k1|123|456.456
+29|k1:v29,k2:v29-2|123:57,456:58|123.123:29.1,456.456:29.2|k1|123|456.456
+30|k1:v30,k2:v30-2|123:59,456:60|123.123:30.1,456.456:30.2|k1|123|456.456
+31|k1:v31,k2:v31-2|123:61,456:62|123.123:31.1,456.456:31.2|k1|123|456.456
+32|k1:v32,k2:v32-2|123:63,456:64|123.123:32.1,456.456:32.2|k1|123|456.456
+33|k1:v33,k2:v33-2|123:65,456:66|123.123:33.1,456.456:33.2|k1|123|456.456
+34|k1:v34,k2:v34-2|123:67,456:68|123.123:34.1,456.456:34.2|k1|123|456.456
+35|k1:v35,k2:v35-2|123:69,456:70|123.123:35.1,456.456:35.2|k1|123|456.456
+36|k1:v36,k2:v36-2|123:71,456:72|123.123:36.1,456.456:36.2|k1|123|456.456
+37|k1:v37,k2:v37-2|123:73,456:74|123.123:37.1,456.456:37.2|k1|123|456.456
+38|k1:v38,k2:v38-2|123:75,456:76|123.123:38.1,456.456:38.2|k1|123|456.456
+39|k1:v39,k2:v39-2|123:77,456:78|123.123:39.1,456.456:39.2|k1|123|456.456
+40|k1:v40,k2:v40-2|123:79,456:80|123.123:40.1,456.456:40.2|k1|123|456.456
+41|k1:v41,k2:v41-2|123:81,456:82|123.123:41.1,456.456:41.2|k1|123|456.456
+42|k1:v42,k2:v42-2|123:83,456:84|123.123:42.1,456.456:42.2|k1|123|456.456
+43|k1:v43,k2:v43-2|123:85,456:86|123.123:43.1,456.456:43.2|k1|123|456.456
+44|k1:v44,k2:v44-2|123:87,456:88|123.123:44.1,456.456:44.2|k1|123|456.456
+45|k1:v45,k2:v45-2|123:89,456:90|123.123:45.1,456.456:45.2|k1|123|456.456
+46|k1:v46,k2:v46-2|123:91,456:92|123.123:46.1,456.456:46.2|k1|123|456.456
+47|k1:v47,k2:v47-2|123:93,456:94|123.123:47.1,456.456:47.2|k1|123|456.456
+48|k1:v48,k2:v48-2|123:95,456:96|123.123:48.1,456.456:48.2|k1|123|456.456
+49|k1:v49,k2:v49-2|123:97,456:98|123.123:49.1,456.456:49.2|k1|123|456.456
+50|k1:v50,k2:v50-2|123:99,456:100|123.123:50.1,456.456:50.2|k1|123|456.456
+51|k1:v51,k2:v51-2|123:101,456:102|123.123:51.1,456.456:51.2|k1|123|456.456
+52|k1:v52,k2:v52-2|123:103,456:104|123.123:52.1,456.456:52.2|k1|123|456.456
+53|k1:v53,k2:v53-2|123:105,456:106|123.123:53.1,456.456:53.2|k1|123|456.456
+54|k1:v54,k2:v54-2|123:107,456:108|123.123:54.1,456.456:54.2|k1|123|456.456
+55|k1:v55,k2:v55-2|123:109,456:110|123.123:55.1,456.456:55.2|k1|123|456.456
+56|k1:v56,k2:v56-2|123:111,456:112|123.123:56.1,456.456:56.2|k1|123|456.456
+57|k1:v57,k2:v57-2|123:113,456:114|123.123:57.1,456.456:57.2|k1|123|456.456
+58|k1:v58,k2:v58-2|123:115,456:116|123.123:58.1,456.456:58.2|k1|123|456.456
+59|k1:v59,k2:v59-2|123:117,456:118|123.123:59.1,456.456:59.2|k1|123|456.456
+60|k1:v60,k2:v60-2|123:119,456:120|123.123:60.1,456.456:60.2|k1|123|456.456
+61|k1:v61,k2:v61-2|123:121,456:122|123.123:61.1,456.456:61.2|k1|123|456.456
+62|k1:v62,k2:v62-2|123:123,456:124|123.123:62.1,456.456:62.2|k1|123|456.456
+63|k1:v63,k2:v63-2|123:125,456:126|123.123:63.1,456.456:63.2|k1|123|456.456
+64|k1:v64,k2:v64-2|123:127,456:128|123.123:64.1,456.456:64.2|k1|123|456.456
+65|k1:v65,k2:v65-2|123:129,456:130|123.123:65.1,456.456:65.2|k1|123|456.456
+66|k1:v66,k2:v66-2|123:131,456:132|123.123:66.1,456.456:66.2|k1|123|456.456
+67|k1:v67,k2:v67-2|123:133,456:134|123.123:67.1,456.456:67.2|k1|123|456.456
+68|k1:v68,k2:v68-2|123:135,456:136|123.123:68.1,456.456:68.2|k1|123|456.456
+69|k1:v69,k2:v69-2|123:137,456:138|123.123:69.1,456.456:69.2|k1|123|456.456
+70|k1:v70,k2:v70-2|123:139,456:140|123.123:70.1,456.456:70.2|k1|123|456.456
+71|k1:v71,k2:v71-2|123:141,456:142|123.123:71.1,456.456:71.2|k1|123|456.456
+72|k1:v72,k2:v72-2|123:143,456:144|123.123:72.1,456.456:72.2|k1|123|456.456
+73|k1:v73,k2:v73-2|123:145,456:146|123.123:73.1,456.456:73.2|k1|123|456.456
+74|k1:v74,k2:v74-2|123:147,456:148|123.123:74.1,456.456:74.2|k1|123|456.456
+75|k1:v75,k2:v75-2|123:149,456:150|123.123:75.1,456.456:75.2|k1|123|456.456
+76|k1:v76,k2:v76-2|123:151,456:152|123.123:76.1,456.456:76.2|k1|123|456.456
+77|k1:v77,k2:v77-2|123:153,456:154|123.123:77.1,456.456:77.2|k1|123|456.456
+78|k1:v78,k2:v78-2|123:155,456:156|123.123:78.1,456.456:78.2|k1|123|456.456
+79|k1:v79,k2:v79-2|123:157,456:158|123.123:79.1,456.456:79.2|k1|123|456.456
+80|k1:v80,k2:v80-2|123:159,456:160|123.123:80.1,456.456:80.2|k1|123|456.456
+81|k1:v81,k2:v81-2|123:161,456:162|123.123:81.1,456.456:81.2|k1|123|456.456
+82|k1:v82,k2:v82-2|123:163,456:164|123.123:82.1,456.456:82.2|k1|123|456.456
+83|k1:v83,k2:v83-2|123:165,456:166|123.123:83.1,456.456:83.2|k1|123|456.456
+84|k1:v84,k2:v84-2|123:167,456:168|123.123:84.1,456.456:84.2|k1|123|456.456
+85|k1:v85,k2:v85-2|123:169,456:170|123.123:85.1,456.456:85.2|k1|123|456.456
+86|k1:v86,k2:v86-2|123:171,456:172|123.123:86.1,456.456:86.2|k1|123|456.456
+87|k1:v87,k2:v87-2|123:173,456:174|123.123:87.1,456.456:87.2|k1|123|456.456
+88|k1:v88,k2:v88-2|123:175,456:176|123.123:88.1,456.456:88.2|k1|123|456.456
+89|k1:v89,k2:v89-2|123:177,456:178|123.123:89.1,456.456:89.2|k1|123|456.456
+90|k1:v90,k2:v90-2|123:179,456:180|123.123:90.1,456.456:90.2|k1|123|456.456
+91|k1:v91,k2:v91-2|123:181,456:182|123.123:91.1,456.456:91.2|k1|123|456.456
+92|k1:v92,k2:v92-2|123:183,456:184|123.123:92.1,456.456:92.2|k1|123|456.456
+93|k1:v93,k2:v93-2|123:185,456:186|123.123:93.1,456.456:93.2|k1|123|456.456
+94|k1:v94,k2:v94-2|123:187,456:188|123.123:94.1,456.456:94.2|k1|123|456.456
+95|k1:v95,k2:v95-2|123:189,456:190|123.123:95.1,456.456:95.2|k1|123|456.456
+96|k1:v96,k2:v96-2|123:191,456:192|123.123:96.1,456.456:96.2|k1|123|456.456
+97|k1:v97,k2:v97-2|123:193,456:194|123.123:97.1,456.456:97.2|k1|123|456.456
+98|k1:v98,k2:v98-2|123:195,456:196|123.123:98.1,456.456:98.2|k1|123|456.456
+99|k1:v99,k2:v99-2|123:197,456:198|123.123:99.1,456.456:99.2|k1|123|456.456
+100|k1:v100,k2:v100-2|123:199,456:200|123.123:100.1,456.456:100.2|k1|123|456.456
+101|k1:v101,k2:v101-2|123:201,456:202|123.123:101.1,456.456:101.2|k1|123|456.456
+102|k1:v102,k2:v102-2|123:203,456:204|123.123:102.1,456.456:102.2|k1|123|456.456
+103|k1:v103,k2:v103-2|123:205,456:206|123.123:103.1,456.456:103.2|k1|123|456.456
+104|k1:v104,k2:v104-2|123:207,456:208|123.123:104.1,456.456:104.2|k1|123|456.456
+105|k1:v105,k2:v105-2|123:209,456:210|123.123:105.1,456.456:105.2|k1|123|456.456
+106|k1:v106,k2:v106-2|123:211,456:212|123.123:106.1,456.456:106.2|k1|123|456.456
+107|k1:v107,k2:v107-2|123:213,456:214|123.123:107.1,456.456:107.2|k1|123|456.456
+108|k1:v108,k2:v108-2|123:215,456:216|123.123:108.1,456.456:108.2|k1|123|456.456
+109|k1:v109,k2:v109-2|123:217,456:218|123.123:109.1,456.456:109.2|k1|123|456.456
+110|k1:v110,k2:v110-2|123:219,456:220|123.123:110.1,456.456:110.2|k1|123|456.456
+111|k1:v111,k2:v111-2|123:221,456:222|123.123:111.1,456.456:111.2|k1|123|456.456
+112|k1:v112,k2:v112-2|123:223,456:224|123.123:112.1,456.456:112.2|k1|123|456.456
+113|k1:v113,k2:v113-2|123:225,456:226|123.123:113.1,456.456:113.2|k1|123|456.456
+114|k1:v114,k2:v114-2|123:227,456:228|123.123:114.1,456.456:114.2|k1|123|456.456
+115|k1:v115,k2:v115-2|123:229,456:230|123.123:115.1,456.456:115.2|k1|123|456.456
+116|k1:v116,k2:v116-2|123:231,456:232|123.123:116.1,456.456:116.2|k1|123|456.456
+117|k1:v117,k2:v117-2|123:233,456:234|123.123:117.1,456.456:117.2|k1|123|456.456
+118|k1:v118,k2:v118-2|123:235,456:236|123.123:118.1,456.456:118.2|k1|123|456.456
+119|k1:v119,k2:v119-2|123:237,456:238|123.123:119.1,456.456:119.2|k1|123|456.456
+120|k1:v120,k2:v120-2|123:239,456:240|123.123:120.1,456.456:120.2|k1|123|456.456
+121|k1:v121,k2:v121-2|123:241,456:242|123.123:121.1,456.456:121.2|k1|123|456.456
+122|k1:v122,k2:v122-2|123:243,456:244|123.123:122.1,456.456:122.2|k1|123|456.456
+123|k1:v123,k2:v123-2|123:245,456:246|123.123:123.1,456.456:123.2|k1|123|456.456
+124|k1:v124,k2:v124-2|123:247,456:248|123.123:124.1,456.456:124.2|k1|123|456.456
+125|k1:v125,k2:v125-2|123:249,456:250|123.123:125.1,456.456:125.2|k1|123|456.456
+126|k1:v126,k2:v126-2|123:251,456:252|123.123:126.1,456.456:126.2|k1|123|456.456
+127|k1:v127,k2:v127-2|123:253,456:254|123.123:127.1,456.456:127.2|k1|123|456.456
+128|k1:v128,k2:v128-2|123:255,456:256|123.123:128.1,456.456:128.2|k1|123|456.456
+129|k1:v129,k2:v129-2|123:257,456:258|123.123:129.1,456.456:129.2|k1|123|456.456
+130|k1:v130,k2:v130-2|123:259,456:260|123.123:130.1,456.456:130.2|k1|123|456.456
+131|k1:v131,k2:v131-2|123:261,456:262|123.123:131.1,456.456:131.2|k1|123|456.456
+132|k1:v132,k2:v132-2|123:263,456:264|123.123:132.1,456.456:132.2|k1|123|456.456
+133|k1:v133,k2:v133-2|123:265,456:266|123.123:133.1,456.456:133.2|k1|123|456.456
+134|k1:v134,k2:v134-2|123:267,456:268|123.123:134.1,456.456:134.2|k1|123|456.456
+135|k1:v135,k2:v135-2|123:269,456:270|123.123:135.1,456.456:135.2|k1|123|456.456
+136|k1:v136,k2:v136-2|123:271,456:272|123.123:136.1,456.456:136.2|k1|123|456.456
+137|k1:v137,k2:v137-2|123:273,456:274|123.123:137.1,456.456:137.2|k1|123|456.456
+138|k1:v138,k2:v138-2|123:275,456:276|123.123:138.1,456.456:138.2|k1|123|456.456
+139|k1:v139,k2:v139-2|123:277,456:278|123.123:139.1,456.456:139.2|k1|123|456.456
+140|k1:v140,k2:v140-2|123:279,456:280|123.123:140.1,456.456:140.2|k1|123|456.456
+141|k1:v141,k2:v141-2|123:281,456:282|123.123:141.1,456.456:141.2|k1|123|456.456
+142|k1:v142,k2:v142-2|123:283,456:284|123.123:142.1,456.456:142.2|k1|123|456.456
+143|k1:v143,k2:v143-2|123:285,456:286|123.123:143.1,456.456:143.2|k1|123|456.456
+144|k1:v144,k2:v144-2|123:287,456:288|123.123:144.1,456.456:144.2|k1|123|456.456
+145|k1:v145,k2:v145-2|123:289,456:290|123.123:145.1,456.456:145.2|k1|123|456.456
+146|k1:v146,k2:v146-2|123:291,456:292|123.123:146.1,456.456:146.2|k1|123|456.456
+147|k1:v147,k2:v147-2|123:293,456:294|123.123:147.1,456.456:147.2|k1|123|456.456
+148|k1:v148,k2:v148-2|123:295,456:296|123.123:148.1,456.456:148.2|k1|123|456.456
+149|k1:v149,k2:v149-2|123:297,456:298|123.123:149.1,456.456:149.2|k1|123|456.456
+150|k1:v150,k2:v150-2|123:299,456:300|123.123:150.1,456.456:150.2|k1|123|456.456
+151|k1:v151,k2:v151-2|123:301,456:302|123.123:151.1,456.456:151.2|k1|123|456.456
+152|k1:v152,k2:v152-2|123:303,456:304|123.123:152.1,456.456:152.2|k1|123|456.456
+153|k1:v153,k2:v153-2|123:305,456:306|123.123:153.1,456.456:153.2|k1|123|456.456
+154|k1:v154,k2:v154-2|123:307,456:308|123.123:154.1,456.456:154.2|k1|123|456.456
+155|k1:v155,k2:v155-2|123:309,456:310|123.123:155.1,456.456:155.2|k1|123|456.456
+156|k1:v156,k2:v156-2|123:311,456:312|123.123:156.1,456.456:156.2|k1|123|456.456
+157|k1:v157,k2:v157-2|123:313,456:314|123.123:157.1,456.456:157.2|k1|123|456.456
+158|k1:v158,k2:v158-2|123:315,456:316|123.123:158.1,456.456:158.2|k1|123|456.456
+159|k1:v159,k2:v159-2|123:317,456:318|123.123:159.1,456.456:159.2|k1|123|456.456
+160|k1:v160,k2:v160-2|123:319,456:320|123.123:160.1,456.456:160.2|k1|123|456.456
+161|k1:v161,k2:v161-2|123:321,456:322|123.123:161.1,456.456:161.2|k1|123|456.456
+162|k1:v162,k2:v162-2|123:323,456:324|123.123:162.1,456.456:162.2|k1|123|456.456
+163|k1:v163,k2:v163-2|123:325,456:326|123.123:163.1,456.456:163.2|k1|123|456.456
+164|k1:v164,k2:v164-2|123:327,456:328|123.123:164.1,456.456:164.2|k1|123|456.456
+165|k1:v165,k2:v165-2|123:329,456:330|123.123:165.1,456.456:165.2|k1|123|456.456
+166|k1:v166,k2:v166-2|123:331,456:332|123.123:166.1,456.456:166.2|k1|123|456.456
+167|k1:v167,k2:v167-2|123:333,456:334|123.123:167.1,456.456:167.2|k1|123|456.456
+168|k1:v168,k2:v168-2|123:335,456:336|123.123:168.1,456.456:168.2|k1|123|456.456
+169|k1:v169,k2:v169-2|123:337,456:338|123.123:169.1,456.456:169.2|k1|123|456.456
+170|k1:v170,k2:v170-2|123:339,456:340|123.123:170.1,456.456:170.2|k1|123|456.456
+171|k1:v171,k2:v171-2|123:341,456:342|123.123:171.1,456.456:171.2|k1|123|456.456
+172|k1:v172,k2:v172-2|123:343,456:344|123.123:172.1,456.456:172.2|k1|123|456.456
+173|k1:v173,k2:v173-2|123:345,456:346|123.123:173.1,456.456:173.2|k1|123|456.456
+174|k1:v174,k2:v174-2|123:347,456:348|123.123:174.1,456.456:174.2|k1|123|456.456
+175|k1:v175,k2:v175-2|123:349,456:350|123.123:175.1,456.456:175.2|k1|123|456.456
+176|k1:v176,k2:v176-2|123:351,456:352|123.123:176.1,456.456:176.2|k1|123|456.456
+177|k1:v177,k2:v177-2|123:353,456:354|123.123:177.1,456.456:177.2|k1|123|456.456
+178|k1:v178,k2:v178-2|123:355,456:356|123.123:178.1,456.456:178.2|k1|123|456.456
+179|k1:v179,k2:v179-2|123:357,456:358|123.123:179.1,456.456:179.2|k1|123|456.456
+180|k1:v180,k2:v180-2|123:359,456:360|123.123:180.1,456.456:180.2|k1|123|456.456
+181|k1:v181,k2:v181-2|123:361,456:362|123.123:181.1,456.456:181.2|k1|123|456.456
+182|k1:v182,k2:v182-2|123:363,456:364|123.123:182.1,456.456:182.2|k1|123|456.456
+183|k1:v183,k2:v183-2|123:365,456:366|123.123:183.1,456.456:183.2|k1|123|456.456
+184|k1:v184,k2:v184-2|123:367,456:368|123.123:184.1,456.456:184.2|k1|123|456.456
+185|k1:v185,k2:v185-2|123:369,456:370|123.123:185.1,456.456:185.2|k1|123|456.456
+186|k1:v186,k2:v186-2|123:371,456:372|123.123:186.1,456.456:186.2|k1|123|456.456
+187|k1:v187,k2:v187-2|123:373,456:374|123.123:187.1,456.456:187.2|k1|123|456.456
+188|k1:v188,k2:v188-2|123:375,456:376|123.123:188.1,456.456:188.2|k1|123|456.456
+189|k1:v189,k2:v189-2|123:377,456:378|123.123:189.1,456.456:189.2|k1|123|456.456
+190|k1:v190,k2:v190-2|123:379,456:380|123.123:190.1,456.456:190.2|k1|123|456.456
+191|k1:v191,k2:v191-2|123:381,456:382|123.123:191.1,456.456:191.2|k1|123|456.456
+192|k1:v192,k2:v192-2|123:383,456:384|123.123:192.1,456.456:192.2|k1|123|456.456
+193|k1:v193,k2:v193-2|123:385,456:386|123.123:193.1,456.456:193.2|k1|123|456.456
+194|k1:v194,k2:v194-2|123:387,456:388|123.123:194.1,456.456:194.2|k1|123|456.456
+195|k1:v195,k2:v195-2|123:389,456:390|123.123:195.1,456.456:195.2|k1|123|456.456
+196|k1:v196,k2:v196-2|123:391,456:392|123.123:196.1,456.456:196.2|k1|123|456.456
+197|k1:v197,k2:v197-2|123:393,456:394|123.123:197.1,456.456:197.2|k1|123|456.456
+198|k1:v198,k2:v198-2|123:395,456:396|123.123:198.1,456.456:198.2|k1|123|456.456
+199|k1:v199,k2:v199-2|123:397,456:398|123.123:199.1,456.456:199.2|k1|123|456.456
+200|k1:v200,k2:v200-2|123:399,456:400|123.123:200.1,456.456:200.2|k1|123|456.456
+201|k1:v201,k2:v201-2|123:401,456:402|123.123:201.1,456.456:201.2|k1|123|456.456
+202|k1:v202,k2:v202-2|123:403,456:404|123.123:202.1,456.456:202.2|k1|123|456.456
+203|k1:v203,k2:v203-2|123:405,456:406|123.123:203.1,456.456:203.2|k1|123|456.456
+204|k1:v204,k2:v204-2|123:407,456:408|123.123:204.1,456.456:204.2|k1|123|456.456
+205|k1:v205,k2:v205-2|123:409,456:410|123.123:205.1,456.456:205.2|k1|123|456.456
+206|k1:v206,k2:v206-2|123:411,456:412|123.123:206.1,456.456:206.2|k1|123|456.456
+207|k1:v207,k2:v207-2|123:413,456:414|123.123:207.1,456.456:207.2|k1|123|456.456
+208|k1:v208,k2:v208-2|123:415,456:416|123.123:208.1,456.456:208.2|k1|123|456.456
+209|k1:v209,k2:v209-2|123:417,456:418|123.123:209.1,456.456:209.2|k1|123|456.456
+210|k1:v210,k2:v210-2|123:419,456:420|123.123:210.1,456.456:210.2|k1|123|456.456
+211|k1:v211,k2:v211-2|123:421,456:422|123.123:211.1,456.456:211.2|k1|123|456.456
+212|k1:v212,k2:v212-2|123:423,456:424|123.123:212.1,456.456:212.2|k1|123|456.456
+213|k1:v213,k2:v213-2|123:425,456:426|123.123:213.1,456.456:213.2|k1|123|456.456
+214|k1:v214,k2:v214-2|123:427,456:428|123.123:214.1,456.456:214.2|k1|123|456.456
+215|k1:v215,k2:v215-2|123:429,456:430|123.123:215.1,456.456:215.2|k1|123|456.456
+216|k1:v216,k2:v216-2|123:431,456:432|123.123:216.1,456.456:216.2|k1|123|456.456
+217|k1:v217,k2:v217-2|123:433,456:434|123.123:217.1,456.456:217.2|k1|123|456.456
+218|k1:v218,k2:v218-2|123:435,456:436|123.123:218.1,456.456:218.2|k1|123|456.456
+219|k1:v219,k2:v219-2|123:437,456:438|123.123:219.1,456.456:219.2|k1|123|456.456
+220|k1:v220,k2:v220-2|123:439,456:440|123.123:220.1,456.456:220.2|k1|123|456.456
+221|k1:v221,k2:v221-2|123:441,456:442|123.123:221.1,456.456:221.2|k1|123|456.456
+222|k1:v222,k2:v222-2|123:443,456:444|123.123:222.1,456.456:222.2|k1|123|456.456
+223|k1:v223,k2:v223-2|123:445,456:446|123.123:223.1,456.456:223.2|k1|123|456.456
+224|k1:v224,k2:v224-2|123:447,456:448|123.123:224.1,456.456:224.2|k1|123|456.456
+225|k1:v225,k2:v225-2|123:449,456:450|123.123:225.1,456.456:225.2|k1|123|456.456
+226|k1:v226,k2:v226-2|123:451,456:452|123.123:226.1,456.456:226.2|k1|123|456.456
+227|k1:v227,k2:v227-2|123:453,456:454|123.123:227.1,456.456:227.2|k1|123|456.456
+228|k1:v228,k2:v228-2|123:455,456:456|123.123:228.1,456.456:228.2|k1|123|456.456
+229|k1:v229,k2:v229-2|123:457,456:458|123.123:229.1,456.456:229.2|k1|123|456.456
+230|k1:v230,k2:v230-2|123:459,456:460|123.123:230.1,456.456:230.2|k1|123|456.456
+231|k1:v231,k2:v231-2|123:461,456:462|123.123:231.1,456.456:231.2|k1|123|456.456
+232|k1:v232,k2:v232-2|123:463,456:464|123.123:232.1,456.456:232.2|k1|123|456.456
+233|k1:v233,k2:v233-2|123:465,456:466|123.123:233.1,456.456:233.2|k1|123|456.456
+234|k1:v234,k2:v234-2|123:467,456:468|123.123:234.1,456.456:234.2|k1|123|456.456
+235|k1:v235,k2:v235-2|123:469,456:470|123.123:235.1,456.456:235.2|k1|123|456.456
+236|k1:v236,k2:v236-2|123:471,456:472|123.123:236.1,456.456:236.2|k1|123|456.456
+237|k1:v237,k2:v237-2|123:473,456:474|123.123:237.1,456.456:237.2|k1|123|456.456
+238|k1:v238,k2:v238-2|123:475,456:476|123.123:238.1,456.456:238.2|k1|123|456.456
+239|k1:v239,k2:v239-2|123:477,456:478|123.123:239.1,456.456:239.2|k1|123|456.456
+240|k1:v240,k2:v240-2|123:479,456:480|123.123:240.1,456.456:240.2|k1|123|456.456
+241|k1:v241,k2:v241-2|123:481,456:482|123.123:241.1,456.456:241.2|k1|123|456.456
+242|k1:v242,k2:v242-2|123:483,456:484|123.123:242.1,456.456:242.2|k1|123|456.456
+243|k1:v243,k2:v243-2|123:485,456:486|123.123:243.1,456.456:243.2|k1|123|456.456
+244|k1:v244,k2:v244-2|123:487,456:488|123.123:244.1,456.456:244.2|k1|123|456.456
+245|k1:v245,k2:v245-2|123:489,456:490|123.123:245.1,456.456:245.2|k1|123|456.456
+246|k1:v246,k2:v246-2|123:491,456:492|123.123:246.1,456.456:246.2|k1|123|456.456
+247|k1:v247,k2:v247-2|123:493,456:494|123.123:247.1,456.456:247.2|k1|123|456.456
+248|k1:v248,k2:v248-2|123:495,456:496|123.123:248.1,456.456:248.2|k1|123|456.456
+249|k1:v249,k2:v249-2|123:497,456:498|123.123:249.1,456.456:249.2|k1|123|456.456
+250|k1:v250,k2:v250-2|123:499,456:500|123.123:250.1,456.456:250.2|k1|123|456.456
+251|k1:v251,k2:v251-2|123:501,456:502|123.123:251.1,456.456:251.2|k1|123|456.456
+252|k1:v252,k2:v252-2|123:503,456:504|123.123:252.1,456.456:252.2|k1|123|456.456
+253|k1:v253,k2:v253-2|123:505,456:506|123.123:253.1,456.456:253.2|k1|123|456.456
+254|k1:v254,k2:v254-2|123:507,456:508|123.123:254.1,456.456:254.2|k1|123|456.456
+255|k1:v255,k2:v255-2|123:509,456:510|123.123:255.1,456.456:255.2|k1|123|456.456
+256|k1:v256,k2:v256-2|123:511,456:512|123.123:256.1,456.456:256.2|k1|123|456.456
+257|k1:v257,k2:v257-2|123:513,456:514|123.123:257.1,456.456:257.2|k1|123|456.456
+258|k1:v258,k2:v258-2|123:515,456:516|123.123:258.1,456.456:258.2|k1|123|456.456
+259|k1:v259,k2:v259-2|123:517,456:518|123.123:259.1,456.456:259.2|k1|123|456.456
+260|k1:v260,k2:v260-2|123:519,456:520|123.123:260.1,456.456:260.2|k1|123|456.456
+261|k1:v261,k2:v261-2|123:521,456:522|123.123:261.1,456.456:261.2|k1|123|456.456
+262|k1:v262,k2:v262-2|123:523,456:524|123.123:262.1,456.456:262.2|k1|123|456.456
+263|k1:v263,k2:v263-2|123:525,456:526|123.123:263.1,456.456:263.2|k1|123|456.456
+264|k1:v264,k2:v264-2|123:527,456:528|123.123:264.1,456.456:264.2|k1|123|456.456
+265|k1:v265,k2:v265-2|123:529,456:530|123.123:265.1,456.456:265.2|k1|123|456.456
+266|k1:v266,k2:v266-2|123:531,456:532|123.123:266.1,456.456:266.2|k1|123|456.456
+267|k1:v267,k2:v267-2|123:533,456:534|123.123:267.1,456.456:267.2|k1|123|456.456
+268|k1:v268,k2:v268-2|123:535,456:536|123.123:268.1,456.456:268.2|k1|123|456.456
+269|k1:v269,k2:v269-2|123:537,456:538|123.123:269.1,456.456:269.2|k1|123|456.456
+270|k1:v270,k2:v270-2|123:539,456:540|123.123:270.1,456.456:270.2|k1|123|456.456
+271|k1:v271,k2:v271-2|123:541,456:542|123.123:271.1,456.456:271.2|k1|123|456.456
+272|k1:v272,k2:v272-2|123:543,456:544|123.123:272.1,456.456:272.2|k1|123|456.456
+273|k1:v273,k2:v273-2|123:545,456:546|123.123:273.1,456.456:273.2|k1|123|456.456
+274|k1:v274,k2:v274-2|123:547,456:548|123.123:274.1,456.456:274.2|k1|123|456.456
+275|k1:v275,k2:v275-2|123:549,456:550|123.123:275.1,456.456:275.2|k1|123|456.456
+276|k1:v276,k2:v276-2|123:551,456:552|123.123:276.1,456.456:276.2|k1|123|456.456
+277|k1:v277,k2:v277-2|123:553,456:554|123.123:277.1,456.456:277.2|k1|123|456.456
+278|k1:v278,k2:v278-2|123:555,456:556|123.123:278.1,456.456:278.2|k1|123|456.456
+279|k1:v279,k2:v279-2|123:557,456:558|123.123:279.1,456.456:279.2|k1|123|456.456
+280|k1:v280,k2:v280-2|123:559,456:560|123.123:280.1,456.456:280.2|k1|123|456.456
+281|k1:v281,k2:v281-2|123:561,456:562|123.123:281.1,456.456:281.2|k1|123|456.456
+282|k1:v282,k2:v282-2|123:563,456:564|123.123:282.1,456.456:282.2|k1|123|456.456
+283|k1:v283,k2:v283-2|123:565,456:566|123.123:283.1,456.456:283.2|k1|123|456.456
+284|k1:v284,k2:v284-2|123:567,456:568|123.123:284.1,456.456:284.2|k1|123|456.456
+285|k1:v285,k2:v285-2|123:569,456:570|123.123:285.1,456.456:285.2|k1|123|456.456
+286|k1:v286,k2:v286-2|123:571,456:572|123.123:286.1,456.456:286.2|k1|123|456.456
+287|k1:v287,k2:v287-2|123:573,456:574|123.123:287.1,456.456:287.2|k1|123|456.456
+288|k1:v288,k2:v288-2|123:575,456:576|123.123:288.1,456.456:288.2|k1|123|456.456
+289|k1:v289,k2:v289-2|123:577,456:578|123.123:289.1,456.456:289.2|k1|123|456.456
+290|k1:v290,k2:v290-2|123:579,456:580|123.123:290.1,456.456:290.2|k1|123|456.456
+291|k1:v291,k2:v291-2|123:581,456:582|123.123:291.1,456.456:291.2|k1|123|456.456
+292|k1:v292,k2:v292-2|123:583,456:584|123.123:292.1,456.456:292.2|k1|123|456.456
+293|k1:v293,k2:v293-2|123:585,456:586|123.123:293.1,456.456:293.2|k1|123|456.456
+294|k1:v294,k2:v294-2|123:587,456:588|123.123:294.1,456.456:294.2|k1|123|456.456
+295|k1:v295,k2:v295-2|123:589,456:590|123.123:295.1,456.456:295.2|k1|123|456.456
+296|k1:v296,k2:v296-2|123:591,456:592|123.123:296.1,456.456:296.2|k1|123|456.456
+297|k1:v297,k2:v297-2|123:593,456:594|123.123:297.1,456.456:297.2|k1|123|456.456
+298|k1:v298,k2:v298-2|123:595,456:596|123.123:298.1,456.456:298.2|k1|123|456.456
+299|k1:v299,k2:v299-2|123:597,456:598|123.123:299.1,456.456:299.2|k1|123|456.456
+300|k1:v300,k2:v300-2|123:599,456:600|123.123:300.1,456.456:300.2|k1|123|456.456
+301|k1:v301,k2:v301-2|123:601,456:602|123.123:301.1,456.456:301.2|k1|123|456.456
+302|k1:v302,k2:v302-2|123:603,456:604|123.123:302.1,456.456:302.2|k1|123|456.456
+303|k1:v303,k2:v303-2|123:605,456:606|123.123:303.1,456.456:303.2|k1|123|456.456
+304|k1:v304,k2:v304-2|123:607,456:608|123.123:304.1,456.456:304.2|k1|123|456.456
+305|k1:v305,k2:v305-2|123:609,456:610|123.123:305.1,456.456:305.2|k1|123|456.456
+306|k1:v306,k2:v306-2|123:611,456:612|123.123:306.1,456.456:306.2|k1|123|456.456
+307|k1:v307,k2:v307-2|123:613,456:614|123.123:307.1,456.456:307.2|k1|123|456.456
+308|k1:v308,k2:v308-2|123:615,456:616|123.123:308.1,456.456:308.2|k1|123|456.456
+309|k1:v309,k2:v309-2|123:617,456:618|123.123:309.1,456.456:309.2|k1|123|456.456
+310|k1:v310,k2:v310-2|123:619,456:620|123.123:310.1,456.456:310.2|k1|123|456.456
+311|k1:v311,k2:v311-2|123:621,456:622|123.123:311.1,456.456:311.2|k1|123|456.456
+312|k1:v312,k2:v312-2|123:623,456:624|123.123:312.1,456.456:312.2|k1|123|456.456
+313|k1:v313,k2:v313-2|123:625,456:626|123.123:313.1,456.456:313.2|k1|123|456.456
+314|k1:v314,k2:v314-2|123:627,456:628|123.123:314.1,456.456:314.2|k1|123|456.456
+315|k1:v315,k2:v315-2|123:629,456:630|123.123:315.1,456.456:315.2|k1|123|456.456
+316|k1:v316,k2:v316-2|123:631,456:632|123.123:316.1,456.456:316.2|k1|123|456.456
+317|k1:v317,k2:v317-2|123:633,456:634|123.123:317.1,456.456:317.2|k1|123|456.456
+318|k1:v318,k2:v318-2|123:635,456:636|123.123:318.1,456.456:318.2|k1|123|456.456
+319|k1:v319,k2:v319-2|123:637,456:638|123.123:319.1,456.456:319.2|k1|123|456.456
+320|k1:v320,k2:v320-2|123:639,456:640|123.123:320.1,456.456:320.2|k1|123|456.456
+321|k1:v321,k2:v321-2|123:641,456:642|123.123:321.1,456.456:321.2|k1|123|456.456
+322|k1:v322,k2:v322-2|123:643,456:644|123.123:322.1,456.456:322.2|k1|123|456.456
+323|k1:v323,k2:v323-2|123:645,456:646|123.123:323.1,456.456:323.2|k1|123|456.456
+324|k1:v324,k2:v324-2|123:647,456:648|123.123:324.1,456.456:324.2|k1|123|456.456
+325|k1:v325,k2:v325-2|123:649,456:650|123.123:325.1,456.456:325.2|k1|123|456.456
+326|k1:v326,k2:v326-2|123:651,456:652|123.123:326.1,456.456:326.2|k1|123|456.456
+327|k1:v327,k2:v327-2|123:653,456:654|123.123:327.1,456.456:327.2|k1|123|456.456
+328|k1:v328,k2:v328-2|123:655,456:656|123.123:328.1,456.456:328.2|k1|123|456.456
+329|k1:v329,k2:v329-2|123:657,456:658|123.123:329.1,456.456:329.2|k1|123|456.456
+330|k1:v330,k2:v330-2|123:659,456:660|123.123:330.1,456.456:330.2|k1|123|456.456
+331|k1:v331,k2:v331-2|123:661,456:662|123.123:331.1,456.456:331.2|k1|123|456.456
+332|k1:v332,k2:v332-2|123:663,456:664|123.123:332.1,456.456:332.2|k1|123|456.456
+333|k1:v333,k2:v333-2|123:665,456:666|123.123:333.1,456.456:333.2|k1|123|456.456
+334|k1:v334,k2:v334-2|123:667,456:668|123.123:334.1,456.456:334.2|k1|123|456.456
+335|k1:v335,k2:v335-2|123:669,456:670|123.123:335.1,456.456:335.2|k1|123|456.456
+336|k1:v336,k2:v336-2|123:671,456:672|123.123:336.1,456.456:336.2|k1|123|456.456
+337|k1:v337,k2:v337-2|123:673,456:674|123.123:337.1,456.456:337.2|k1|123|456.456
+338|k1:v338,k2:v338-2|123:675,456:676|123.123:338.1,456.456:338.2|k1|123|456.456
+339|k1:v339,k2:v339-2|123:677,456:678|123.123:339.1,456.456:339.2|k1|123|456.456
+340|k1:v340,k2:v340-2|123:679,456:680|123.123:340.1,456.456:340.2|k1|123|456.456
+341|k1:v341,k2:v341-2|123:681,456:682|123.123:341.1,456.456:341.2|k1|123|456.456
+342|k1:v342,k2:v342-2|123:683,456:684|123.123:342.1,456.456:342.2|k1|123|456.456
+343|k1:v343,k2:v343-2|123:685,456:686|123.123:343.1,456.456:343.2|k1|123|456.456
+344|k1:v344,k2:v344-2|123:687,456:688|123.123:344.1,456.456:344.2|k1|123|456.456
+345|k1:v345,k2:v345-2|123:689,456:690|123.123:345.1,456.456:345.2|k1|123|456.456
+346|k1:v346,k2:v346-2|123:691,456:692|123.123:346.1,456.456:346.2|k1|123|456.456
+347|k1:v347,k2:v347-2|123:693,456:694|123.123:347.1,456.456:347.2|k1|123|456.456
+348|k1:v348,k2:v348-2|123:695,456:696|123.123:348.1,456.456:348.2|k1|123|456.456
+349|k1:v349,k2:v349-2|123:697,456:698|123.123:349.1,456.456:349.2|k1|123|456.456
+350|k1:v350,k2:v350-2|123:699,456:700|123.123:350.1,456.456:350.2|k1|123|456.456
+351|k1:v351,k2:v351-2|123:701,456:702|123.123:351.1,456.456:351.2|k1|123|456.456
+352|k1:v352,k2:v352-2|123:703,456:704|123.123:352.1,456.456:352.2|k1|123|456.456
+353|k1:v353,k2:v353-2|123:705,456:706|123.123:353.1,456.456:353.2|k1|123|456.456
+354|k1:v354,k2:v354-2|123:707,456:708|123.123:354.1,456.456:354.2|k1|123|456.456
+355|k1:v355,k2:v355-2|123:709,456:710|123.123:355.1,456.456:355.2|k1|123|456.456
+356|k1:v356,k2:v356-2|123:711,456:712|123.123:356.1,456.456:356.2|k1|123|456.456
+357|k1:v357,k2:v357-2|123:713,456:714|123.123:357.1,456.456:357.2|k1|123|456.456
+358|k1:v358,k2:v358-2|123:715,456:716|123.123:358.1,456.456:358.2|k1|123|456.456
+359|k1:v359,k2:v359-2|123:717,456:718|123.123:359.1,456.456:359.2|k1|123|456.456
+360|k1:v360,k2:v360-2|123:719,456:720|123.123:360.1,456.456:360.2|k1|123|456.456
+361|k1:v361,k2:v361-2|123:721,456:722|123.123:361.1,456.456:361.2|k1|123|456.456
+362|k1:v362,k2:v362-2|123:723,456:724|123.123:362.1,456.456:362.2|k1|123|456.456
+363|k1:v363,k2:v363-2|123:725,456:726|123.123:363.1,456.456:363.2|k1|123|456.456
+364|k1:v364,k2:v364-2|123:727,456:728|123.123:364.1,456.456:364.2|k1|123|456.456
+365|k1:v365,k2:v365-2|123:729,456:730|123.123:365.1,456.456:365.2|k1|123|456.456
+366|k1:v366,k2:v366-2|123:731,456:732|123.123:366.1,456.456:366.2|k1|123|456.456
+367|k1:v367,k2:v367-2|123:733,456:734|123.123:367.1,456.456:367.2|k1|123|456.456
+368|k1:v368,k2:v368-2|123:735,456:736|123.123:368.1,456.456:368.2|k1|123|456.456
+369|k1:v369,k2:v369-2|123:737,456:738|123.123:369.1,456.456:369.2|k1|123|456.456
+370|k1:v370,k2:v370-2|123:739,456:740|123.123:370.1,456.456:370.2|k1|123|456.456
+371|k1:v371,k2:v371-2|123:741,456:742|123.123:371.1,456.456:371.2|k1|123|456.456
+372|k1:v372,k2:v372-2|123:743,456:744|123.123:372.1,456.456:372.2|k1|123|456.456
+373|k1:v373,k2:v373-2|123:745,456:746|123.123:373.1,456.456:373.2|k1|123|456.456
+374|k1:v374,k2:v374-2|123:747,456:748|123.123:374.1,456.456:374.2|k1|123|456.456
+375|k1:v375,k2:v375-2|123:749,456:750|123.123:375.1,456.456:375.2|k1|123|456.456
+376|k1:v376,k2:v376-2|123:751,456:752|123.123:376.1,456.456:376.2|k1|123|456.456
+377|k1:v377,k2:v377-2|123:753,456:754|123.123:377.1,456.456:377.2|k1|123|456.456
+378|k1:v378,k2:v378-2|123:755,456:756|123.123:378.1,456.456:378.2|k1|123|456.456
+379|k1:v379,k2:v379-2|123:757,456:758|123.123:379.1,456.456:379.2|k1|123|456.456
+380|k1:v380,k2:v380-2|123:759,456:760|123.123:380.1,456.456:380.2|k1|123|456.456
+381|k1:v381,k2:v381-2|123:761,456:762|123.123:381.1,456.456:381.2|k1|123|456.456
+382|k1:v382,k2:v382-2|123:763,456:764|123.123:382.1,456.456:382.2|k1|123|456.456
+383|k1:v383,k2:v383-2|123:765,456:766|123.123:383.1,456.456:383.2|k1|123|456.456
+384|k1:v384,k2:v384-2|123:767,456:768|123.123:384.1,456.456:384.2|k1|123|456.456
+385|k1:v385,k2:v385-2|123:769,456:770|123.123:385.1,456.456:385.2|k1|123|456.456
+386|k1:v386,k2:v386-2|123:771,456:772|123.123:386.1,456.456:386.2|k1|123|456.456
+387|k1:v387,k2:v387-2|123:773,456:774|123.123:387.1,456.456:387.2|k1|123|456.456
+388|k1:v388,k2:v388-2|123:775,456:776|123.123:388.1,456.456:388.2|k1|123|456.456
+389|k1:v389,k2:v389-2|123:777,456:778|123.123:389.1,456.456:389.2|k1|123|456.456
+390|k1:v390,k2:v390-2|123:779,456:780|123.123:390.1,456.456:390.2|k1|123|456.456
+391|k1:v391,k2:v391-2|123:781,456:782|123.123:391.1,456.456:391.2|k1|123|456.456
+392|k1:v392,k2:v392-2|123:783,456:784|123.123:392.1,456.456:392.2|k1|123|456.456
+393|k1:v393,k2:v393-2|123:785,456:786|123.123:393.1,456.456:393.2|k1|123|456.456
+394|k1:v394,k2:v394-2|123:787,456:788|123.123:394.1,456.456:394.2|k1|123|456.456
+395|k1:v395,k2:v395-2|123:789,456:790|123.123:395.1,456.456:395.2|k1|123|456.456
+396|k1:v396,k2:v396-2|123:791,456:792|123.123:396.1,456.456:396.2|k1|123|456.456
+397|k1:v397,k2:v397-2|123:793,456:794|123.123:397.1,456.456:397.2|k1|123|456.456
+398|k1:v398,k2:v398-2|123:795,456:796|123.123:398.1,456.456:398.2|k1|123|456.456
+399|k1:v399,k2:v399-2|123:797,456:798|123.123:399.1,456.456:399.2|k1|123|456.456
+400|k1:v400,k2:v400-2|123:799,456:800|123.123:400.1,456.456:400.2|k1|123|456.456
+401|k1:v401,k2:v401-2|123:801,456:802|123.123:401.1,456.456:401.2|k1|123|456.456
+402|k1:v402,k2:v402-2|123:803,456:804|123.123:402.1,456.456:402.2|k1|123|456.456
+403|k1:v403,k2:v403-2|123:805,456:806|123.123:403.1,456.456:403.2|k1|123|456.456
+404|k1:v404,k2:v404-2|123:807,456:808|123.123:404.1,456.456:404.2|k1|123|456.456
+405|k1:v405,k2:v405-2|123:809,456:810|123.123:405.1,456.456:405.2|k1|123|456.456
+406|k1:v406,k2:v406-2|123:811,456:812|123.123:406.1,456.456:406.2|k1|123|456.456
+407|k1:v407,k2:v407-2|123:813,456:814|123.123:407.1,456.456:407.2|k1|123|456.456
+408|k1:v408,k2:v408-2|123:815,456:816|123.123:408.1,456.456:408.2|k1|123|456.456
+409|k1:v409,k2:v409-2|123:817,456:818|123.123:409.1,456.456:409.2|k1|123|456.456
+410|k1:v410,k2:v410-2|123:819,456:820|123.123:410.1,456.456:410.2|k1|123|456.456
+411|k1:v411,k2:v411-2|123:821,456:822|123.123:411.1,456.456:411.2|k1|123|456.456
+412|k1:v412,k2:v412-2|123:823,456:824|123.123:412.1,456.456:412.2|k1|123|456.456
+413|k1:v413,k2:v413-2|123:825,456:826|123.123:413.1,456.456:413.2|k1|123|456.456
+414|k1:v414,k2:v414-2|123:827,456:828|123.123:414.1,456.456:414.2|k1|123|456.456
+415|k1:v415,k2:v415-2|123:829,456:830|123.123:415.1,456.456:415.2|k1|123|456.456
+416|k1:v416,k2:v416-2|123:831,456:832|123.123:416.1,456.456:416.2|k1|123|456.456
+417|k1:v417,k2:v417-2|123:833,456:834|123.123:417.1,456.456:417.2|k1|123|456.456
+418|k1:v418,k2:v418-2|123:835,456:836|123.123:418.1,456.456:418.2|k1|123|456.456
+419|k1:v419,k2:v419-2|123:837,456:838|123.123:419.1,456.456:419.2|k1|123|456.456
+420|k1:v420,k2:v420-2|123:839,456:840|123.123:420.1,456.456:420.2|k1|123|456.456
+421|k1:v421,k2:v421-2|123:841,456:842|123.123:421.1,456.456:421.2|k1|123|456.456
+422|k1:v422,k2:v422-2|123:843,456:844|123.123:422.1,456.456:422.2|k1|123|456.456
+423|k1:v423,k2:v423-2|123:845,456:846|123.123:423.1,456.456:423.2|k1|123|456.456
+424|k1:v424,k2:v424-2|123:847,456:848|123.123:424.1,456.456:424.2|k1|123|456.456
+425|k1:v425,k2:v425-2|123:849,456:850|123.123:425.1,456.456:425.2|k1|123|456.456
+426|k1:v426,k2:v426-2|123:851,456:852|123.123:426.1,456.456:426.2|k1|123|456.456
+427|k1:v427,k2:v427-2|123:853,456:854|123.123:427.1,456.456:427.2|k1|123|456.456
+428|k1:v428,k2:v428-2|123:855,456:856|123.123:428.1,456.456:428.2|k1|123|456.456
+429|k1:v429,k2:v429-2|123:857,456:858|123.123:429.1,456.456:429.2|k1|123|456.456
+430|k1:v430,k2:v430-2|123:859,456:860|123.123:430.1,456.456:430.2|k1|123|456.456
+431|k1:v431,k2:v431-2|123:861,456:862|123.123:431.1,456.456:431.2|k1|123|456.456
+432|k1:v432,k2:v432-2|123:863,456:864|123.123:432.1,456.456:432.2|k1|123|456.456
+433|k1:v433,k2:v433-2|123:865,456:866|123.123:433.1,456.456:433.2|k1|123|456.456
+434|k1:v434,k2:v434-2|123:867,456:868|123.123:434.1,456.456:434.2|k1|123|456.456
+435|k1:v435,k2:v435-2|123:869,456:870|123.123:435.1,456.456:435.2|k1|123|456.456
+436|k1:v436,k2:v436-2|123:871,456:872|123.123:436.1,456.456:436.2|k1|123|456.456
+437|k1:v437,k2:v437-2|123:873,456:874|123.123:437.1,456.456:437.2|k1|123|456.456
+438|k1:v438,k2:v438-2|123:875,456:876|123.123:438.1,456.456:438.2|k1|123|456.456
+439|k1:v439,k2:v439-2|123:877,456:878|123.123:439.1,456.456:439.2|k1|123|456.456
+440|k1:v440,k2:v440-2|123:879,456:880|123.123:440.1,456.456:440.2|k1|123|456.456
+441|k1:v441,k2:v441-2|123:881,456:882|123.123:441.1,456.456:441.2|k1|123|456.456
+442|k1:v442,k2:v442-2|123:883,456:884|123.123:442.1,456.456:442.2|k1|123|456.456
+443|k1:v443,k2:v443-2|123:885,456:886|123.123:443.1,456.456:443.2|k1|123|456.456
+444|k1:v444,k2:v444-2|123:887,456:888|123.123:444.1,456.456:444.2|k1|123|456.456
+445|k1:v445,k2:v445-2|123:889,456:890|123.123:445.1,456.456:445.2|k1|123|456.456
+446|k1:v446,k2:v446-2|123:891,456:892|123.123:446.1,456.456:446.2|k1|123|456.456
+447|k1:v447,k2:v447-2|123:893,456:894|123.123:447.1,456.456:447.2|k1|123|456.456
+448|k1:v448,k2:v448-2|123:895,456:896|123.123:448.1,456.456:448.2|k1|123|456.456
+449|k1:v449,k2:v449-2|123:897,456:898|123.123:449.1,456.456:449.2|k1|123|456.456
+450|k1:v450,k2:v450-2|123:899,456:900|123.123:450.1,456.456:450.2|k1|123|456.456
+451|k1:v451,k2:v451-2|123:901,456:902|123.123:451.1,456.456:451.2|k1|123|456.456
+452|k1:v452,k2:v452-2|123:903,456:904|123.123:452.1,456.456:452.2|k1|123|456.456
+453|k1:v453,k2:v453-2|123:905,456:906|123.123:453.1,456.456:453.2|k1|123|456.456
+454|k1:v454,k2:v454-2|123:907,456:908|123.123:454.1,456.456:454.2|k1|123|456.456
+455|k1:v455,k2:v455-2|123:909,456:910|123.123:455.1,456.456:455.2|k1|123|456.456
+456|k1:v456,k2:v456-2|123:911,456:912|123.123:456.1,456.456:456.2|k1|123|456.456
+457|k1:v457,k2:v457-2|123:913,456:914|123.123:457.1,456.456:457.2|k1|123|456.456
+458|k1:v458,k2:v458-2|123:915,456:916|123.123:458.1,456.456:458.2|k1|123|456.456
+459|k1:v459,k2:v459-2|123:917,456:918|123.123:459.1,456.456:459.2|k1|123|456.456
+460|k1:v460,k2:v460-2|123:919,456:920|123.123:460.1,456.456:460.2|k1|123|456.456
+461|k1:v461,k2:v461-2|123:921,456:922|123.123:461.1,456.456:461.2|k1|123|456.456
+462|k1:v462,k2:v462-2|123:923,456:924|123.123:462.1,456.456:462.2|k1|123|456.456
+463|k1:v463,k2:v463-2|123:925,456:926|123.123:463.1,456.456:463.2|k1|123|456.456
+464|k1:v464,k2:v464-2|123:927,456:928|123.123:464.1,456.456:464.2|k1|123|456.456
+465|k1:v465,k2:v465-2|123:929,456:930|123.123:465.1,456.456:465.2|k1|123|456.456
+466|k1:v466,k2:v466-2|123:931,456:932|123.123:466.1,456.456:466.2|k1|123|456.456
+467|k1:v467,k2:v467-2|123:933,456:934|123.123:467.1,456.456:467.2|k1|123|456.456
+468|k1:v468,k2:v468-2|123:935,456:936|123.123:468.1,456.456:468.2|k1|123|456.456
+469|k1:v469,k2:v469-2|123:937,456:938|123.123:469.1,456.456:469.2|k1|123|456.456
+470|k1:v470,k2:v470-2|123:939,456:940|123.123:470.1,456.456:470.2|k1|123|456.456
+471|k1:v471,k2:v471-2|123:941,456:942|123.123:471.1,456.456:471.2|k1|123|456.456
+472|k1:v472,k2:v472-2|123:943,456:944|123.123:472.1,456.456:472.2|k1|123|456.456
+473|k1:v473,k2:v473-2|123:945,456:946|123.123:473.1,456.456:473.2|k1|123|456.456
+474|k1:v474,k2:v474-2|123:947,456:948|123.123:474.1,456.456:474.2|k1|123|456.456
+475|k1:v475,k2:v475-2|123:949,456:950|123.123:475.1,456.456:475.2|k1|123|456.456
+476|k1:v476,k2:v476-2|123:951,456:952|123.123:476.1,456.456:476.2|k1|123|456.456
+477|k1:v477,k2:v477-2|123:953,456:954|123.123:477.1,456.456:477.2|k1|123|456.456
+478|k1:v478,k2:v478-2|123:955,456:956|123.123:478.1,456.456:478.2|k1|123|456.456
+479|k1:v479,k2:v479-2|123:957,456:958|123.123:479.1,456.456:479.2|k1|123|456.456
+480|k1:v480,k2:v480-2|123:959,456:960|123.123:480.1,456.456:480.2|k1|123|456.456
+481|k1:v481,k2:v481-2|123:961,456:962|123.123:481.1,456.456:481.2|k1|123|456.456
+482|k1:v482,k2:v482-2|123:963,456:964|123.123:482.1,456.456:482.2|k1|123|456.456
+483|k1:v483,k2:v483-2|123:965,456:966|123.123:483.1,456.456:483.2|k1|123|456.456
+484|k1:v484,k2:v484-2|123:967,456:968|123.123:484.1,456.456:484.2|k1|123|456.456
+485|k1:v485,k2:v485-2|123:969,456:970|123.123:485.1,456.456:485.2|k1|123|456.456
+486|k1:v486,k2:v486-2|123:971,456:972|123.123:486.1,456.456:486.2|k1|123|456.456
+487|k1:v487,k2:v487-2|123:973,456:974|123.123:487.1,456.456:487.2|k1|123|456.456
+488|k1:v488,k2:v488-2|123:975,456:976|123.123:488.1,456.456:488.2|k1|123|456.456
+489|k1:v489,k2:v489-2|123:977,456:978|123.123:489.1,456.456:489.2|k1|123|456.456
+490|k1:v490,k2:v490-2|123:979,456:980|123.123:490.1,456.456:490.2|k1|123|456.456
+491|k1:v491,k2:v491-2|123:981,456:982|123.123:491.1,456.456:491.2|k1|123|456.456
+492|k1:v492,k2:v492-2|123:983,456:984|123.123:492.1,456.456:492.2|k1|123|456.456
+493|k1:v493,k2:v493-2|123:985,456:986|123.123:493.1,456.456:493.2|k1|123|456.456
+494|k1:v494,k2:v494-2|123:987,456:988|123.123:494.1,456.456:494.2|k1|123|456.456
+495|k1:v495,k2:v495-2|123:989,456:990|123.123:495.1,456.456:495.2|k1|123|456.456
+496|k1:v496,k2:v496-2|123:991,456:992|123.123:496.1,456.456:496.2|k1|123|456.456
+497|k1:v497,k2:v497-2|123:993,456:994|123.123:497.1,456.456:497.2|k1|123|456.456
+498|k1:v498,k2:v498-2|123:995,456:996|123.123:498.1,456.456:498.2|k1|123|456.456
+499|k1:v499,k2:v499-2|123:997,456:998|123.123:499.1,456.456:499.2|k1|123|456.456
+500|k1:v500,k2:v500-2|123:999,456:1000|123.123:500.1,456.456:500.2|k1|123|456.456
+501|k1:v501,k2:v501-2|123:1001,456:1002|123.123:501.1,456.456:501.2|k1|123|456.456
+502|k1:v502,k2:v502-2|123:1003,456:1004|123.123:502.1,456.456:502.2|k1|123|456.456
+503|k1:v503,k2:v503-2|123:1005,456:1006|123.123:503.1,456.456:503.2|k1|123|456.456
+504|k1:v504,k2:v504-2|123:1007,456:1008|123.123:504.1,456.456:504.2|k1|123|456.456
+505|k1:v505,k2:v505-2|123:1009,456:1010|123.123:505.1,456.456:505.2|k1|123|456.456
+506|k1:v506,k2:v506-2|123:1011,456:1012|123.123:506.1,456.456:506.2|k1|123|456.456
+507|k1:v507,k2:v507-2|123:1013,456:1014|123.123:507.1,456.456:507.2|k1|123|456.456
+508|k1:v508,k2:v508-2|123:1015,456:1016|123.123:508.1,456.456:508.2|k1|123|456.456
+509|k1:v509,k2:v509-2|123:1017,456:1018|123.123:509.1,456.456:509.2|k1|123|456.456
+510|k1:v510,k2:v510-2|123:1019,456:1020|123.123:510.1,456.456:510.2|k1|123|456.456
+511|k1:v511,k2:v511-2|123:1021,456:1022|123.123:511.1,456.456:511.2|k1|123|456.456
+512|k1:v512,k2:v512-2|123:1023,456:1024|123.123:512.1,456.456:512.2|k1|123|456.456
+513|k1:v513,k2:v513-2|123:1025,456:1026|123.123:513.1,456.456:513.2|k1|123|456.456
+514|k1:v514,k2:v514-2|123:1027,456:1028|123.123:514.1,456.456:514.2|k1|123|456.456
+515|k1:v515,k2:v515-2|123:1029,456:1030|123.123:515.1,456.456:515.2|k1|123|456.456
+516|k1:v516,k2:v516-2|123:1031,456:1032|123.123:516.1,456.456:516.2|k1|123|456.456
+517|k1:v517,k2:v517-2|123:1033,456:1034|123.123:517.1,456.456:517.2|k1|123|456.456
+518|k1:v518,k2:v518-2|123:1035,456:1036|123.123:518.1,456.456:518.2|k1|123|456.456
+519|k1:v519,k2:v519-2|123:1037,456:1038|123.123:519.1,456.456:519.2|k1|123|456.456
+520|k1:v520,k2:v520-2|123:1039,456:1040|123.123:520.1,456.456:520.2|k1|123|456.456
+521|k1:v521,k2:v521-2|123:1041,456:1042|123.123:521.1,456.456:521.2|k1|123|456.456
+522|k1:v522,k2:v522-2|123:1043,456:1044|123.123:522.1,456.456:522.2|k1|123|456.456
+523|k1:v523,k2:v523-2|123:1045,456:1046|123.123:523.1,456.456:523.2|k1|123|456.456
+524|k1:v524,k2:v524-2|123:1047,456:1048|123.123:524.1,456.456:524.2|k1|123|456.456
+525|k1:v525,k2:v525-2|123:1049,456:1050|123.123:525.1,456.456:525.2|k1|123|456.456
+526|k1:v526,k2:v526-2|123:1051,456:1052|123.123:526.1,456.456:526.2|k1|123|456.456
+527|k1:v527,k2:v527-2|123:1053,456:1054|123.123:527.1,456.456:527.2|k1|123|456.456
+528|k1:v528,k2:v528-2|123:1055,456:1056|123.123:528.1,456.456:528.2|k1|123|456.456
+529|k1:v529,k2:v529-2|123:1057,456:1058|123.123:529.1,456.456:529.2|k1|123|456.456
+530|k1:v530,k2:v530-2|123:1059,456:1060|123.123:530.1,456.456:530.2|k1|123|456.456
+531|k1:v531,k2:v531-2|123:1061,456:1062|123.123:531.1,456.456:531.2|k1|123|456.456
+532|k1:v532,k2:v532-2|123:1063,456:1064|123.123:532.1,456.456:532.2|k1|123|456.456
+533|k1:v533,k2:v533-2|123:1065,456:1066|123.123:533.1,456.456:533.2|k1|123|456.456
+534|k1:v534,k2:v534-2|123:1067,456:1068|123.123:534.1,456.456:534.2|k1|123|456.456
+535|k1:v535,k2:v535-2|123:1069,456:1070|123.123:535.1,456.456:535.2|k1|123|456.456
+536|k1:v536,k2:v536-2|123:1071,456:1072|123.123:536.1,456.456:536.2|k1|123|456.456
+537|k1:v537,k2:v537-2|123:1073,456:1074|123.123:537.1,456.456:537.2|k1|123|456.456
+538|k1:v538,k2:v538-2|123:1075,456:1076|123.123:538.1,456.456:538.2|k1|123|456.456
+539|k1:v539,k2:v539-2|123:1077,456:1078|123.123:539.1,456.456:539.2|k1|123|456.456
+540|k1:v540,k2:v540-2|123:1079,456:1080|123.123:540.1,456.456:540.2|k1|123|456.456
+541|k1:v541,k2:v541-2|123:1081,456:1082|123.123:541.1,456.456:541.2|k1|123|456.456
+542|k1:v542,k2:v542-2|123:1083,456:1084|123.123:542.1,456.456:542.2|k1|123|456.456
+543|k1:v543,k2:v543-2|123:1085,456:1086|123.123:543.1,456.456:543.2|k1|123|456.456
+544|k1:v544,k2:v544-2|123:1087,456:1088|123.123:544.1,456.456:544.2|k1|123|456.456
+545|k1:v545,k2:v545-2|123:1089,456:1090|123.123:545.1,456.456:545.2|k1|123|456.456
+546|k1:v546,k2:v546-2|123:1091,456:1092|123.123:546.1,456.456:546.2|k1|123|456.456
+547|k1:v547,k2:v547-2|123:1093,456:1094|123.123:547.1,456.456:547.2|k1|123|456.456
+548|k1:v548,k2:v548-2|123:1095,456:1096|123.123:548.1,456.456:548.2|k1|123|456.456
+549|k1:v549,k2:v549-2|123:1097,456:1098|123.123:549.1,456.456:549.2|k1|123|456.456
+550|k1:v550,k2:v550-2|123:1099,456:1100|123.123:550.1,456.456:550.2|k1|123|456.456
+551|k1:v551,k2:v551-2|123:1101,456:1102|123.123:551.1,456.456:551.2|k1|123|456.456
+552|k1:v552,k2:v552-2|123:1103,456:1104|123.123:552.1,456.456:552.2|k1|123|456.456
+553|k1:v553,k2:v553-2|123:1105,456:1106|123.123:553.1,456.456:553.2|k1|123|456.456
+554|k1:v554,k2:v554-2|123:1107,456:1108|123.123:554.1,456.456:554.2|k1|123|456.456
+555|k1:v555,k2:v555-2|123:1109,456:1110|123.123:555.1,456.456:555.2|k1|123|456.456
+556|k1:v556,k2:v556-2|123:1111,456:1112|123.123:556.1,456.456:556.2|k1|123|456.456
+557|k1:v557,k2:v557-2|123:1113,456:1114|123.123:557.1,456.456:557.2|k1|123|456.456
+558|k1:v558,k2:v558-2|123:1115,456:1116|123.123:558.1,456.456:558.2|k1|123|456.456
+559|k1:v559,k2:v559-2|123:1117,456:1118|123.123:559.1,456.456:559.2|k1|123|456.456
+560|k1:v560,k2:v560-2|123:1119,456:1120|123.123:560.1,456.456:560.2|k1|123|456.456
+561|k1:v561,k2:v561-2|123:1121,456:1122|123.123:561.1,456.456:561.2|k1|123|456.456
+562|k1:v562,k2:v562-2|123:1123,456:1124|123.123:562.1,456.456:562.2|k1|123|456.456
+563|k1:v563,k2:v563-2|123:1125,456:1126|123.123:563.1,456.456:563.2|k1|123|456.456
+564|k1:v564,k2:v564-2|123:1127,456:1128|123.123:564.1,456.456:564.2|k1|123|456.456
+565|k1:v565,k2:v565-2|123:1129,456:1130|123.123:565.1,456.456:565.2|k1|123|456.456
+566|k1:v566,k2:v566-2|123:1131,456:1132|123.123:566.1,456.456:566.2|k1|123|456.456
+567|k1:v567,k2:v567-2|123:1133,456:1134|123.123:567.1,456.456:567.2|k1|123|456.456
+568|k1:v568,k2:v568-2|123:1135,456:1136|123.123:568.1,456.456:568.2|k1|123|456.456
+569|k1:v569,k2:v569-2|123:1137,456:1138|123.123:569.1,456.456:569.2|k1|123|456.456
+570|k1:v570,k2:v570-2|123:1139,456:1140|123.123:570.1,456.456:570.2|k1|123|456.456
+571|k1:v571,k2:v571-2|123:1141,456:1142|123.123:571.1,456.456:571.2|k1|123|456.456
+572|k1:v572,k2:v572-2|123:1143,456:1144|123.123:572.1,456.456:572.2|k1|123|456.456
+573|k1:v573,k2:v573-2|123:1145,456:1146|123.123:573.1,456.456:573.2|k1|123|456.456
+574|k1:v574,k2:v574-2|123:1147,456:1148|123.123:574.1,456.456:574.2|k1|123|456.456
+575|k1:v575,k2:v575-2|123:1149,456:1150|123.123:575.1,456.456:575.2|k1|123|456.456
+576|k1:v576,k2:v576-2|123:1151,456:1152|123.123:576.1,456.456:576.2|k1|123|456.456
+577|k1:v577,k2:v577-2|123:1153,456:1154|123.123:577.1,456.456:577.2|k1|123|456.456
+578|k1:v578,k2:v578-2|123:1155,456:1156|123.123:578.1,456.456:578.2|k1|123|456.456
+579|k1:v579,k2:v579-2|123:1157,456:1158|123.123:579.1,456.456:579.2|k1|123|456.456
+580|k1:v580,k2:v580-2|123:1159,456:1160|123.123:580.1,456.456:580.2|k1|123|456.456
+581|k1:v581,k2:v581-2|123:1161,456:1162|123.123:581.1,456.456:581.2|k1|123|456.456
+582|k1:v582,k2:v582-2|123:1163,456:1164|123.123:582.1,456.456:582.2|k1|123|456.456
+583|k1:v583,k2:v583-2|123:1165,456:1166|123.123:583.1,456.456:583.2|k1|123|456.456
+584|k1:v584,k2:v584-2|123:1167,456:1168|123.123:584.1,456.456:584.2|k1|123|456.456
+585|k1:v585,k2:v585-2|123:1169,456:1170|123.123:585.1,456.456:585.2|k1|123|456.456
+586|k1:v586,k2:v586-2|123:1171,456:1172|123.123:586.1,456.456:586.2|k1|123|456.456
+587|k1:v587,k2:v587-2|123:1173,456:1174|123.123:587.1,456.456:587.2|k1|123|456.456
+588|k1:v588,k2:v588-2|123:1175,456:1176|123.123:588.1,456.456:588.2|k1|123|456.456
+589|k1:v589,k2:v589-2|123:1177,456:1178|123.123:589.1,456.456:589.2|k1|123|456.456
+590|k1:v590,k2:v590-2|123:1179,456:1180|123.123:590.1,456.456:590.2|k1|123|456.456
+591|k1:v591,k2:v591-2|123:1181,456:1182|123.123:591.1,456.456:591.2|k1|123|456.456
+592|k1:v592,k2:v592-2|123:1183,456:1184|123.123:592.1,456.456:592.2|k1|123|456.456
+593|k1:v593,k2:v593-2|123:1185,456:1186|123.123:593.1,456.456:593.2|k1|123|456.456
+594|k1:v594,k2:v594-2|123:1187,456:1188|123.123:594.1,456.456:594.2|k1|123|456.456
+595|k1:v595,k2:v595-2|123:1189,456:1190|123.123:595.1,456.456:595.2|k1|123|456.456
+596|k1:v596,k2:v596-2|123:1191,456:1192|123.123:596.1,456.456:596.2|k1|123|456.456
+597|k1:v597,k2:v597-2|123:1193,456:1194|123.123:597.1,456.456:597.2|k1|123|456.456
+598|k1:v598,k2:v598-2|123:1195,456:1196|123.123:598.1,456.456:598.2|k1|123|456.456
+599|k1:v599,k2:v599-2|123:1197,456:1198|123.123:599.1,456.456:599.2|k1|123|456.456
+600|k1:v600,k2:v600-2|123:1199,456:1200|123.123:600.1,456.456:600.2|k1|123|456.456
+601|k1:v601,k2:v601-2|123:1201,456:1202|123.123:601.1,456.456:601.2|k1|123|456.456
+602|k1:v602,k2:v602-2|123:1203,456:1204|123.123:602.1,456.456:602.2|k1|123|456.456
+603|k1:v603,k2:v603-2|123:1205,456:1206|123.123:603.1,456.456:603.2|k1|123|456.456
+604|k1:v604,k2:v604-2|123:1207,456:1208|123.123:604.1,456.456:604.2|k1|123|456.456
+605|k1:v605,k2:v605-2|123:1209,456:1210|123.123:605.1,456.456:605.2|k1|123|456.456
+606|k1:v606,k2:v606-2|123:1211,456:1212|123.123:606.1,456.456:606.2|k1|123|456.456
+607|k1:v607,k2:v607-2|123:1213,456:1214|123.123:607.1,456.456:607.2|k1|123|456.456
+608|k1:v608,k2:v608-2|123:1215,456:1216|123.123:608.1,456.456:608.2|k1|123|456.456
+609|k1:v609,k2:v609-2|123:1217,456:1218|123.123:609.1,456.456:609.2|k1|123|456.456
+610|k1:v610,k2:v610-2|123:1219,456:1220|123.123:610.1,456.456:610.2|k1|123|456.456
+611|k1:v611,k2:v611-2|123:1221,456:1222|123.123:611.1,456.456:611.2|k1|123|456.456
+612|k1:v612,k2:v612-2|123:1223,456:1224|123.123:612.1,456.456:612.2|k1|123|456.456
+613|k1:v613,k2:v613-2|123:1225,456:1226|123.123:613.1,456.456:613.2|k1|123|456.456
+614|k1:v614,k2:v614-2|123:1227,456:1228|123.123:614.1,456.456:614.2|k1|123|456.456
+615|k1:v615,k2:v615-2|123:1229,456:1230|123.123:615.1,456.456:615.2|k1|123|456.456
+616|k1:v616,k2:v616-2|123:1231,456:1232|123.123:616.1,456.456:616.2|k1|123|456.456
+617|k1:v617,k2:v617-2|123:1233,456:1234|123.123:617.1,456.456:617.2|k1|123|456.456
+618|k1:v618,k2:v618-2|123:1235,456:1236|123.123:618.1,456.456:618.2|k1|123|456.456
+619|k1:v619,k2:v619-2|123:1237,456:1238|123.123:619.1,456.456:619.2|k1|123|456.456
+620|k1:v620,k2:v620-2|123:1239,456:1240|123.123:620.1,456.456:620.2|k1|123|456.456
+621|k1:v621,k2:v621-2|123:1241,456:1242|123.123:621.1,456.456:621.2|k1|123|456.456
+622|k1:v622,k2:v622-2|123:1243,456:1244|123.123:622.1,456.456:622.2|k1|123|456.456
+623|k1:v623,k2:v623-2|123:1245,456:1246|123.123:623.1,456.456:623.2|k1|123|456.456
+624|k1:v624,k2:v624-2|123:1247,456:1248|123.123:624.1,456.456:624.2|k1|123|456.456
+625|k1:v625,k2:v625-2|123:1249,456:1250|123.123:625.1,456.456:625.2|k1|123|456.456
+626|k1:v626,k2:v626-2|123:1251,456:1252|123.123:626.1,456.456:626.2|k1|123|456.456
+627|k1:v627,k2:v627-2|123:1253,456:1254|123.123:627.1,456.456:627.2|k1|123|456.456
+628|k1:v628,k2:v628-2|123:1255,456:1256|123.123:628.1,456.456:628.2|k1|123|456.456
+629|k1:v629,k2:v629-2|123:1257,456:1258|123.123:629.1,456.456:629.2|k1|123|456.456
+630|k1:v630,k2:v630-2|123:1259,456:1260|123.123:630.1,456.456:630.2|k1|123|456.456
+631|k1:v631,k2:v631-2|123:1261,456:1262|123.123:631.1,456.456:631.2|k1|123|456.456
+632|k1:v632,k2:v632-2|123:1263,456:1264|123.123:632.1,456.456:632.2|k1|123|456.456
+633|k1:v633,k2:v633-2|123:1265,456:1266|123.123:633.1,456.456:633.2|k1|123|456.456
+634|k1:v634,k2:v634-2|123:1267,456:1268|123.123:634.1,456.456:634.2|k1|123|456.456
+635|k1:v635,k2:v635-2|123:1269,456:1270|123.123:635.1,456.456:635.2|k1|123|456.456
+636|k1:v636,k2:v636-2|123:1271,456:1272|123.123:636.1,456.456:636.2|k1|123|456.456
+637|k1:v637,k2:v637-2|123:1273,456:1274|123.123:637.1,456.456:637.2|k1|123|456.456
+638|k1:v638,k2:v638-2|123:1275,456:1276|123.123:638.1,456.456:638.2|k1|123|456.456
+639|k1:v639,k2:v639-2|123:1277,456:1278|123.123:639.1,456.456:639.2|k1|123|456.456
+640|k1:v640,k2:v640-2|123:1279,456:1280|123.123:640.1,456.456:640.2|k1|123|456.456
+641|k1:v641,k2:v641-2|123:1281,456:1282|123.123:641.1,456.456:641.2|k1|123|456.456
+642|k1:v642,k2:v642-2|123:1283,456:1284|123.123:642.1,456.456:642.2|k1|123|456.456
+643|k1:v643,k2:v643-2|123:1285,456:1286|123.123:643.1,456.456:643.2|k1|123|456.456
+644|k1:v644,k2:v644-2|123:1287,456:1288|123.123:644.1,456.456:644.2|k1|123|456.456
+645|k1:v645,k2:v645-2|123:1289,456:1290|123.123:645.1,456.456:645.2|k1|123|456.456
+646|k1:v646,k2:v646-2|123:1291,456:1292|123.123:646.1,456.456:646.2|k1|123|456.456
+647|k1:v647,k2:v647-2|123:1293,456:1294|123.123:647.1,456.456:647.2|k1|123|456.456
+648|k1:v648,k2:v648-2|123:1295,456:1296|123.123:648.1,456.456:648.2|k1|123|456.456
+649|k1:v649,k2:v649-2|123:1297,456:1298|123.123:649.1,456.456:649.2|k1|123|456.456
+650|k1:v650,k2:v650-2|123:1299,456:1300|123.123:650.1,456.456:650.2|k1|123|456.456
+651|k1:v651,k2:v651-2|123:1301,456:1302|123.123:651.1,456.456:651.2|k1|123|456.456
+652|k1:v652,k2:v652-2|123:1303,456:1304|123.123:652.1,456.456:652.2|k1|123|456.456
+653|k1:v653,k2:v653-2|123:1305,456:1306|123.123:653.1,456.456:653.2|k1|123|456.456
+654|k1:v654,k2:v654-2|123:1307,456:1308|123.123:654.1,456.456:654.2|k1|123|456.456
+655|k1:v655,k2:v655-2|123:1309,456:1310|123.123:655.1,456.456:655.2|k1|123|456.456
+656|k1:v656,k2:v656-2|123:1311,456:1312|123.123:656.1,456.456:656.2|k1|123|456.456
+657|k1:v657,k2:v657-2|123:1313,456:1314|123.123:657.1,456.456:657.2|k1|123|456.456
+658|k1:v658,k2:v658-2|123:1315,456:1316|123.123:658.1,456.456:658.2|k1|123|456.456
+659|k1:v659,k2:v659-2|123:1317,456:1318|123.123:659.1,456.456:659.2|k1|123|456.456
+660|k1:v660,k2:v660-2|123:1319,456:1320|123.123:660.1,456.456:660.2|k1|123|456.456
+661|k1:v661,k2:v661-2|123:1321,456:1322|123.123:661.1,456.456:661.2|k1|123|456.456
+662|k1:v662,k2:v662-2|123:1323,456:1324|123.123:662.1,456.456:662.2|k1|123|456.456
+663|k1:v663,k2:v663-2|123:1325,456:1326|123.123:663.1,456.456:663.2|k1|123|456.456
+664|k1:v664,k2:v664-2|123:1327,456:1328|123.123:664.1,456.456:664.2|k1|123|456.456
+665|k1:v665,k2:v665-2|123:1329,456:1330|123.123:665.1,456.456:665.2|k1|123|456.456
+666|k1:v666,k2:v666-2|123:1331,456:1332|123.123:666.1,456.456:666.2|k1|123|456.456
+667|k1:v667,k2:v667-2|123:1333,456:1334|123.123:667.1,456.456:667.2|k1|123|456.456
+668|k1:v668,k2:v668-2|123:1335,456:1336|123.123:668.1,456.456:668.2|k1|123|456.456
+669|k1:v669,k2:v669-2|123:1337,456:1338|123.123:669.1,456.456:669.2|k1|123|456.456
+670|k1:v670,k2:v670-2|123:1339,456:1340|123.123:670.1,456.456:670.2|k1|123|456.456
+671|k1:v671,k2:v671-2|123:1341,456:1342|123.123:671.1,456.456:671.2|k1|123|456.456
+672|k1:v672,k2:v672-2|123:1343,456:1344|123.123:672.1,456.456:672.2|k1|123|456.456
+673|k1:v673,k2:v673-2|123:1345,456:1346|123.123:673.1,456.456:673.2|k1|123|456.456
+674|k1:v674,k2:v674-2|123:1347,456:1348|123.123:674.1,456.456:674.2|k1|123|456.456
+675|k1:v675,k2:v675-2|123:1349,456:1350|123.123:675.1,456.456:675.2|k1|123|456.456
+676|k1:v676,k2:v676-2|123:1351,456:1352|123.123:676.1,456.456:676.2|k1|123|456.456
+677|k1:v677,k2:v677-2|123:1353,456:1354|123.123:677.1,456.456:677.2|k1|123|456.456
+678|k1:v678,k2:v678-2|123:1355,456:1356|123.123:678.1,456.456:678.2|k1|123|456.456
+679|k1:v679,k2:v679-2|123:1357,456:1358|123.123:679.1,456.456:679.2|k1|123|456.456
+680|k1:v680,k2:v680-2|123:1359,456:1360|123.123:680.1,456.456:680.2|k1|123|456.456
+681|k1:v681,k2:v681-2|123:1361,456:1362|123.123:681.1,456.456:681.2|k1|123|456.456
+682|k1:v682,k2:v682-2|123:1363,456:1364|123.123:682.1,456.456:682.2|k1|123|456.456
+683|k1:v683,k2:v683-2|123:1365,456:1366|123.123:683.1,456.456:683.2|k1|123|456.456
+684|k1:v684,k2:v684-2|123:1367,456:1368|123.123:684.1,456.456:684.2|k1|123|456.456
+685|k1:v685,k2:v685-2|123:1369,456:1370|123.123:685.1,456.456:685.2|k1|123|456.456
+686|k1:v686,k2:v686-2|123:1371,456:1372|123.123:686.1,456.456:686.2|k1|123|456.456
+687|k1:v687,k2:v687-2|123:1373,456:1374|123.123:687.1,456.456:687.2|k1|123|456.456
+688|k1:v688,k2:v688-2|123:1375,456:1376|123.123:688.1,456.456:688.2|k1|123|456.456
+689|k1:v689,k2:v689-2|123:1377,456:1378|123.123:689.1,456.456:689.2|k1|123|456.456
+690|k1:v690,k2:v690-2|123:1379,456:1380|123.123:690.1,456.456:690.2|k1|123|456.456
+691|k1:v691,k2:v691-2|123:1381,456:1382|123.123:691.1,456.456:691.2|k1|123|456.456
+692|k1:v692,k2:v692-2|123:1383,456:1384|123.123:692.1,456.456:692.2|k1|123|456.456
+693|k1:v693,k2:v693-2|123:1385,456:1386|123.123:693.1,456.456:693.2|k1|123|456.456
+694|k1:v694,k2:v694-2|123:1387,456:1388|123.123:694.1,456.456:694.2|k1|123|456.456
+695|k1:v695,k2:v695-2|123:1389,456:1390|123.123:695.1,456.456:695.2|k1|123|456.456
+696|k1:v696,k2:v696-2|123:1391,456:1392|123.123:696.1,456.456:696.2|k1|123|456.456
+697|k1:v697,k2:v697-2|123:1393,456:1394|123.123:697.1,456.456:697.2|k1|123|456.456
+698|k1:v698,k2:v698-2|123:1395,456:1396|123.123:698.1,456.456:698.2|k1|123|456.456
+699|k1:v699,k2:v699-2|123:1397,456:1398|123.123:699.1,456.456:699.2|k1|123|456.456
+700|k1:v700,k2:v700-2|123:1399,456:1400|123.123:700.1,456.456:700.2|k1|123|456.456
+701|k1:v701,k2:v701-2|123:1401,456:1402|123.123:701.1,456.456:701.2|k1|123|456.456
+702|k1:v702,k2:v702-2|123:1403,456:1404|123.123:702.1,456.456:702.2|k1|123|456.456
+703|k1:v703,k2:v703-2|123:1405,456:1406|123.123:703.1,456.456:703.2|k1|123|456.456
+704|k1:v704,k2:v704-2|123:1407,456:1408|123.123:704.1,456.456:704.2|k1|123|456.456
+705|k1:v705,k2:v705-2|123:1409,456:1410|123.123:705.1,456.456:705.2|k1|123|456.456
+706|k1:v706,k2:v706-2|123:1411,456:1412|123.123:706.1,456.456:706.2|k1|123|456.456
+707|k1:v707,k2:v707-2|123:1413,456:1414|123.123:707.1,456.456:707.2|k1|123|456.456
+708|k1:v708,k2:v708-2|123:1415,456:1416|123.123:708.1,456.456:708.2|k1|123|456.456
+709|k1:v709,k2:v709-2|123:1417,456:1418|123.123:709.1,456.456:709.2|k1|123|456.456
+710|k1:v710,k2:v710-2|123:1419,456:1420|123.123:710.1,456.456:710.2|k1|123|456.456
+711|k1:v711,k2:v711-2|123:1421,456:1422|123.123:711.1,456.456:711.2|k1|123|456.456
+712|k1:v712,k2:v712-2|123:1423,456:1424|123.123:712.1,456.456:712.2|k1|123|456.456
+713|k1:v713,k2:v713-2|123:1425,456:1426|123.123:713.1,456.456:713.2|k1|123|456.456
+714|k1:v714,k2:v714-2|123:1427,456:1428|123.123:714.1,456.456:714.2|k1|123|456.456
+715|k1:v715,k2:v715-2|123:1429,456:1430|123.123:715.1,456.456:715.2|k1|123|456.456
+716|k1:v716,k2:v716-2|123:1431,456:1432|123.123:716.1,456.456:716.2|k1|123|456.456
+717|k1:v717,k2:v717-2|123:1433,456:1434|123.123:717.1,456.456:717.2|k1|123|456.456
+718|k1:v718,k2:v718-2|123:1435,456:1436|123.123:718.1,456.456:718.2|k1|123|456.456
+719|k1:v719,k2:v719-2|123:1437,456:1438|123.123:719.1,456.456:719.2|k1|123|456.456
+720|k1:v720,k2:v720-2|123:1439,456:1440|123.123:720.1,456.456:720.2|k1|123|456.456
+721|k1:v721,k2:v721-2|123:1441,456:1442|123.123:721.1,456.456:721.2|k1|123|456.456
+722|k1:v722,k2:v722-2|123:1443,456:1444|123.123:722.1,456.456:722.2|k1|123|456.456
+723|k1:v723,k2:v723-2|123:1445,456:1446|123.123:723.1,456.456:723.2|k1|123|456.456
+724|k1:v724,k2:v724-2|123:1447,456:1448|123.123:724.1,456.456:724.2|k1|123|456.456
+725|k1:v725,k2:v725-2|123:1449,456:1450|123.123:725.1,456.456:725.2|k1|123|456.456
+726|k1:v726,k2:v726-2|123:1451,456:1452|123.123:726.1,456.456:726.2|k1|123|456.456
+727|k1:v727,k2:v727-2|123:1453,456:1454|123.123:727.1,456.456:727.2|k1|123|456.456
+728|k1:v728,k2:v728-2|123:1455,456:1456|123.123:728.1,456.456:728.2|k1|123|456.456
+729|k1:v729,k2:v729-2|123:1457,456:1458|123.123:729.1,456.456:729.2|k1|123|456.456
+730|k1:v730,k2:v730-2|123:1459,456:1460|123.123:730.1,456.456:730.2|k1|123|456.456
+731|k1:v731,k2:v731-2|123:1461,456:1462|123.123:731.1,456.456:731.2|k1|123|456.456
+732|k1:v732,k2:v732-2|123:1463,456:1464|123.123:732.1,456.456:732.2|k1|123|456.456
+733|k1:v733,k2:v733-2|123:1465,456:1466|123.123:733.1,456.456:733.2|k1|123|456.456
+734|k1:v734,k2:v734-2|123:1467,456:1468|123.123:734.1,456.456:734.2|k1|123|456.456
+735|k1:v735,k2:v735-2|123:1469,456:1470|123.123:735.1,456.456:735.2|k1|123|456.456
+736|k1:v736,k2:v736-2|123:1471,456:1472|123.123:736.1,456.456:736.2|k1|123|456.456
+737|k1:v737,k2:v737-2|123:1473,456:1474|123.123:737.1,456.456:737.2|k1|123|456.456
+738|k1:v738,k2:v738-2|123:1475,456:1476|123.123:738.1,456.456:738.2|k1|123|456.456
+739|k1:v739,k2:v739-2|123:1477,456:1478|123.123:739.1,456.456:739.2|k1|123|456.456
+740|k1:v740,k2:v740-2|123:1479,456:1480|123.123:740.1,456.456:740.2|k1|123|456.456
+741|k1:v741,k2:v741-2|123:1481,456:1482|123.123:741.1,456.456:741.2|k1|123|456.456
+742|k1:v742,k2:v742-2|123:1483,456:1484|123.123:742.1,456.456:742.2|k1|123|456.456
+743|k1:v743,k2:v743-2|123:1485,456:1486|123.123:743.1,456.456:743.2|k1|123|456.456
+744|k1:v744,k2:v744-2|123:1487,456:1488|123.123:744.1,456.456:744.2|k1|123|456.456
+745|k1:v745,k2:v745-2|123:1489,456:1490|123.123:745.1,456.456:745.2|k1|123|456.456
+746|k1:v746,k2:v746-2|123:1491,456:1492|123.123:746.1,456.456:746.2|k1|123|456.456
+747|k1:v747,k2:v747-2|123:1493,456:1494|123.123:747.1,456.456:747.2|k1|123|456.456
+748|k1:v748,k2:v748-2|123:1495,456:1496|123.123:748.1,456.456:748.2|k1|123|456.456
+749|k1:v749,k2:v749-2|123:1497,456:1498|123.123:749.1,456.456:749.2|k1|123|456.456
+750|k1:v750,k2:v750-2|123:1499,456:1500|123.123:750.1,456.456:750.2|k1|123|456.456
+751|k1:v751,k2:v751-2|123:1501,456:1502|123.123:751.1,456.456:751.2|k1|123|456.456
+752|k1:v752,k2:v752-2|123:1503,456:1504|123.123:752.1,456.456:752.2|k1|123|456.456
+753|k1:v753,k2:v753-2|123:1505,456:1506|123.123:753.1,456.456:753.2|k1|123|456.456
+754|k1:v754,k2:v754-2|123:1507,456:1508|123.123:754.1,456.456:754.2|k1|123|456.456
+755|k1:v755,k2:v755-2|123:1509,456:1510|123.123:755.1,456.456:755.2|k1|123|456.456
+756|k1:v756,k2:v756-2|123:1511,456:1512|123.123:756.1,456.456:756.2|k1|123|456.456
+757|k1:v757,k2:v757-2|123:1513,456:1514|123.123:757.1,456.456:757.2|k1|123|456.456
+758|k1:v758,k2:v758-2|123:1515,456:1516|123.123:758.1,456.456:758.2|k1|123|456.456
+759|k1:v759,k2:v759-2|123:1517,456:1518|123.123:759.1,456.456:759.2|k1|123|456.456
+760|k1:v760,k2:v760-2|123:1519,456:1520|123.123:760.1,456.456:760.2|k1|123|456.456
+761|k1:v761,k2:v761-2|123:1521,456:1522|123.123:761.1,456.456:761.2|k1|123|456.456
+762|k1:v762,k2:v762-2|123:1523,456:1524|123.123:762.1,456.456:762.2|k1|123|456.456
+763|k1:v763,k2:v763-2|123:1525,456:1526|123.123:763.1,456.456:763.2|k1|123|456.456
+764|k1:v764,k2:v764-2|123:1527,456:1528|123.123:764.1,456.456:764.2|k1|123|456.456
+765|k1:v765,k2:v765-2|123:1529,456:1530|123.123:765.1,456.456:765.2|k1|123|456.456
+766|k1:v766,k2:v766-2|123:1531,456:1532|123.123:766.1,456.456:766.2|k1|123|456.456
+767|k1:v767,k2:v767-2|123:1533,456:1534|123.123:767.1,456.456:767.2|k1|123|456.456
+768|k1:v768,k2:v768-2|123:1535,456:1536|123.123:768.1,456.456:768.2|k1|123|456.456
+769|k1:v769,k2:v769-2|123:1537,456:1538|123.123:769.1,456.456:769.2|k1|123|456.456
+770|k1:v770,k2:v770-2|123:1539,456:1540|123.123:770.1,456.456:770.2|k1|123|456.456
+771|k1:v771,k2:v771-2|123:1541,456:1542|123.123:771.1,456.456:771.2|k1|123|456.456
+772|k1:v772,k2:v772-2|123:1543,456:1544|123.123:772.1,456.456:772.2|k1|123|456.456
+773|k1:v773,k2:v773-2|123:1545,456:1546|123.123:773.1,456.456:773.2|k1|123|456.456
+774|k1:v774,k2:v774-2|123:1547,456:1548|123.123:774.1,456.456:774.2|k1|123|456.456
+775|k1:v775,k2:v775-2|123:1549,456:1550|123.123:775.1,456.456:775.2|k1|123|456.456
+776|k1:v776,k2:v776-2|123:1551,456:1552|123.123:776.1,456.456:776.2|k1|123|456.456
+777|k1:v777,k2:v777-2|123:1553,456:1554|123.123:777.1,456.456:777.2|k1|123|456.456
+778|k1:v778,k2:v778-2|123:1555,456:1556|123.123:778.1,456.456:778.2|k1|123|456.456
+779|k1:v779,k2:v779-2|123:1557,456:1558|123.123:779.1,456.456:779.2|k1|123|456.456
+780|k1:v780,k2:v780-2|123:1559,456:1560|123.123:780.1,456.456:780.2|k1|123|456.456
+781|k1:v781,k2:v781-2|123:1561,456:1562|123.123:781.1,456.456:781.2|k1|123|456.456
+782|k1:v782,k2:v782-2|123:1563,456:1564|123.123:782.1,456.456:782.2|k1|123|456.456
+783|k1:v783,k2:v783-2|123:1565,456:1566|123.123:783.1,456.456:783.2|k1|123|456.456
+784|k1:v784,k2:v784-2|123:1567,456:1568|123.123:784.1,456.456:784.2|k1|123|456.456
+785|k1:v785,k2:v785-2|123:1569,456:1570|123.123:785.1,456.456:785.2|k1|123|456.456
+786|k1:v786,k2:v786-2|123:1571,456:1572|123.123:786.1,456.456:786.2|k1|123|456.456
+787|k1:v787,k2:v787-2|123:1573,456:1574|123.123:787.1,456.456:787.2|k1|123|456.456
+788|k1:v788,k2:v788-2|123:1575,456:1576|123.123:788.1,456.456:788.2|k1|123|456.456
+789|k1:v789,k2:v789-2|123:1577,456:1578|123.123:789.1,456.456:789.2|k1|123|456.456
+790|k1:v790,k2:v790-2|123:1579,456:1580|123.123:790.1,456.456:790.2|k1|123|456.456
+791|k1:v791,k2:v791-2|123:1581,456:1582|123.123:791.1,456.456:791.2|k1|123|456.456
+792|k1:v792,k2:v792-2|123:1583,456:1584|123.123:792.1,456.456:792.2|k1|123|456.456
+793|k1:v793,k2:v793-2|123:1585,456:1586|123.123:793.1,456.456:793.2|k1|123|456.456
+794|k1:v794,k2:v794-2|123:1587,456:1588|123.123:794.1,456.456:794.2|k1|123|456.456
+795|k1:v795,k2:v795-2|123:1589,456:1590|123.123:795.1,456.456:795.2|k1|123|456.456
+796|k1:v796,k2:v796-2|123:1591,456:1592|123.123:796.1,456.456:796.2|k1|123|456.456
+797|k1:v797,k2:v797-2|123:1593,456:1594|123.123:797.1,456.456:797.2|k1|123|456.456
+798|k1:v798,k2:v798-2|123:1595,456:1596|123.123:798.1,456.456:798.2|k1|123|456.456
+799|k1:v799,k2:v799-2|123:1597,456:1598|123.123:799.1,456.456:799.2|k1|123|456.456
+800|k1:v800,k2:v800-2|123:1599,456:1600|123.123:800.1,456.456:800.2|k1|123|456.456
+801|k1:v801,k2:v801-2|123:1601,456:1602|123.123:801.1,456.456:801.2|k1|123|456.456
+802|k1:v802,k2:v802-2|123:1603,456:1604|123.123:802.1,456.456:802.2|k1|123|456.456
+803|k1:v803,k2:v803-2|123:1605,456:1606|123.123:803.1,456.456:803.2|k1|123|456.456
+804|k1:v804,k2:v804-2|123:1607,456:1608|123.123:804.1,456.456:804.2|k1|123|456.456
+805|k1:v805,k2:v805-2|123:1609,456:1610|123.123:805.1,456.456:805.2|k1|123|456.456
+806|k1:v806,k2:v806-2|123:1611,456:1612|123.123:806.1,456.456:806.2|k1|123|456.456
+807|k1:v807,k2:v807-2|123:1613,456:1614|123.123:807.1,456.456:807.2|k1|123|456.456
+808|k1:v808,k2:v808-2|123:1615,456:1616|123.123:808.1,456.456:808.2|k1|123|456.456
+809|k1:v809,k2:v809-2|123:1617,456:1618|123.123:809.1,456.456:809.2|k1|123|456.456
+810|k1:v810,k2:v810-2|123:1619,456:1620|123.123:810.1,456.456:810.2|k1|123|456.456
+811|k1:v811,k2:v811-2|123:1621,456:1622|123.123:811.1,456.456:811.2|k1|123|456.456
+812|k1:v812,k2:v812-2|123:1623,456:1624|123.123:812.1,456.456:812.2|k1|123|456.456
+813|k1:v813,k2:v813-2|123:1625,456:1626|123.123:813.1,456.456:813.2|k1|123|456.456
+814|k1:v814,k2:v814-2|123:1627,456:1628|123.123:814.1,456.456:814.2|k1|123|456.456
+815|k1:v815,k2:v815-2|123:1629,456:1630|123.123:815.1,456.456:815.2|k1|123|456.456
+816|k1:v816,k2:v816-2|123:1631,456:1632|123.123:816.1,456.456:816.2|k1|123|456.456
+817|k1:v817,k2:v817-2|123:1633,456:1634|123.123:817.1,456.456:817.2|k1|123|456.456
+818|k1:v818,k2:v818-2|123:1635,456:1636|123.123:818.1,456.456:818.2|k1|123|456.456
+819|k1:v819,k2:v819-2|123:1637,456:1638|123.123:819.1,456.456:819.2|k1|123|456.456
+820|k1:v820,k2:v820-2|123:1639,456:1640|123.123:820.1,456.456:820.2|k1|123|456.456
+821|k1:v821,k2:v821-2|123:1641,456:1642|123.123:821.1,456.456:821.2|k1|123|456.456
+822|k1:v822,k2:v822-2|123:1643,456:1644|123.123:822.1,456.456:822.2|k1|123|456.456
+823|k1:v823,k2:v823-2|123:1645,456:1646|123.123:823.1,456.456:823.2|k1|123|456.456
+824|k1:v824,k2:v824-2|123:1647,456:1648|123.123:824.1,456.456:824.2|k1|123|456.456
+825|k1:v825,k2:v825-2|123:1649,456:1650|123.123:825.1,456.456:825.2|k1|123|456.456
+826|k1:v826,k2:v826-2|123:1651,456:1652|123.123:826.1,456.456:826.2|k1|123|456.456
+827|k1:v827,k2:v827-2|123:1653,456:1654|123.123:827.1,456.456:827.2|k1|123|456.456
+828|k1:v828,k2:v828-2|123:1655,456:1656|123.123:828.1,456.456:828.2|k1|123|456.456
+829|k1:v829,k2:v829-2|123:1657,456:1658|123.123:829.1,456.456:829.2|k1|123|456.456
+830|k1:v830,k2:v830-2|123:1659,456:1660|123.123:830.1,456.456:830.2|k1|123|456.456
+831|k1:v831,k2:v831-2|123:1661,456:1662|123.123:831.1,456.456:831.2|k1|123|456.456
+832|k1:v832,k2:v832-2|123:1663,456:1664|123.123:832.1,456.456:832.2|k1|123|456.456
+833|k1:v833,k2:v833-2|123:1665,456:1666|123.123:833.1,456.456:833.2|k1|123|456.456
+834|k1:v834,k2:v834-2|123:1667,456:1668|123.123:834.1,456.456:834.2|k1|123|456.456
+835|k1:v835,k2:v835-2|123:1669,456:1670|123.123:835.1,456.456:835.2|k1|123|456.456
+836|k1:v836,k2:v836-2|123:1671,456:1672|123.123:836.1,456.456:836.2|k1|123|456.456
+837|k1:v837,k2:v837-2|123:1673,456:1674|123.123:837.1,456.456:837.2|k1|123|456.456
+838|k1:v838,k2:v838-2|123:1675,456:1676|123.123:838.1,456.456:838.2|k1|123|456.456
+839|k1:v839,k2:v839-2|123:1677,456:1678|123.123:839.1,456.456:839.2|k1|123|456.456
+840|k1:v840,k2:v840-2|123:1679,456:1680|123.123:840.1,456.456:840.2|k1|123|456.456
+841|k1:v841,k2:v841-2|123:1681,456:1682|123.123:841.1,456.456:841.2|k1|123|456.456
+842|k1:v842,k2:v842-2|123:1683,456:1684|123.123:842.1,456.456:842.2|k1|123|456.456
+843|k1:v843,k2:v843-2|123:1685,456:1686|123.123:843.1,456.456:843.2|k1|123|456.456
+844|k1:v844,k2:v844-2|123:1687,456:1688|123.123:844.1,456.456:844.2|k1|123|456.456
+845|k1:v845,k2:v845-2|123:1689,456:1690|123.123:845.1,456.456:845.2|k1|123|456.456
+846|k1:v846,k2:v846-2|123:1691,456:1692|123.123:846.1,456.456:846.2|k1|123|456.456
+847|k1:v847,k2:v847-2|123:1693,456:1694|123.123:847.1,456.456:847.2|k1|123|456.456
+848|k1:v848,k2:v848-2|123:1695,456:1696|123.123:848.1,456.456:848.2|k1|123|456.456
+849|k1:v849,k2:v849-2|123:1697,456:1698|123.123:849.1,456.456:849.2|k1|123|456.456
+850|k1:v850,k2:v850-2|123:1699,456:1700|123.123:850.1,456.456:850.2|k1|123|456.456
+851|k1:v851,k2:v851-2|123:1701,456:1702|123.123:851.1,456.456:851.2|k1|123|456.456
+852|k1:v852,k2:v852-2|123:1703,456:1704|123.123:852.1,456.456:852.2|k1|123|456.456
+853|k1:v853,k2:v853-2|123:1705,456:1706|123.123:853.1,456.456:853.2|k1|123|456.456
+854|k1:v854,k2:v854-2|123:1707,456:1708|123.123:854.1,456.456:854.2|k1|123|456.456
+855|k1:v855,k2:v855-2|123:1709,456:1710|123.123:855.1,456.456:855.2|k1|123|456.456
+856|k1:v856,k2:v856-2|123:1711,456:1712|123.123:856.1,456.456:856.2|k1|123|456.456
+857|k1:v857,k2:v857-2|123:1713,456:1714|123.123:857.1,456.456:857.2|k1|123|456.456
+858|k1:v858,k2:v858-2|123:1715,456:1716|123.123:858.1,456.456:858.2|k1|123|456.456
+859|k1:v859,k2:v859-2|123:1717,456:1718|123.123:859.1,456.456:859.2|k1|123|456.456
+860|k1:v860,k2:v860-2|123:1719,456:1720|123.123:860.1,456.456:860.2|k1|123|456.456
+861|k1:v861,k2:v861-2|123:1721,456:1722|123.123:861.1,456.456:861.2|k1|123|456.456
+862|k1:v862,k2:v862-2|123:1723,456:1724|123.123:862.1,456.456:862.2|k1|123|456.456
+863|k1:v863,k2:v863-2|123:1725,456:1726|123.123:863.1,456.456:863.2|k1|123|456.456
+864|k1:v864,k2:v864-2|123:1727,456:1728|123.123:864.1,456.456:864.2|k1|123|456.456
+865|k1:v865,k2:v865-2|123:1729,456:1730|123.123:865.1,456.456:865.2|k1|123|456.456
+866|k1:v866,k2:v866-2|123:1731,456:1732|123.123:866.1,456.456:866.2|k1|123|456.456
+867|k1:v867,k2:v867-2|123:1733,456:1734|123.123:867.1,456.456:867.2|k1|123|456.456
+868|k1:v868,k2:v868-2|123:1735,456:1736|123.123:868.1,456.456:868.2|k1|123|456.456
+869|k1:v869,k2:v869-2|123:1737,456:1738|123.123:869.1,456.456:869.2|k1|123|456.456
+870|k1:v870,k2:v870-2|123:1739,456:1740|123.123:870.1,456.456:870.2|k1|123|456.456
+871|k1:v871,k2:v871-2|123:1741,456:1742|123.123:871.1,456.456:871.2|k1|123|456.456
+872|k1:v872,k2:v872-2|123:1743,456:1744|123.123:872.1,456.456:872.2|k1|123|456.456
+873|k1:v873,k2:v873-2|123:1745,456:1746|123.123:873.1,456.456:873.2|k1|123|456.456
+874|k1:v874,k2:v874-2|123:1747,456:1748|123.123:874.1,456.456:874.2|k1|123|456.456
+875|k1:v875,k2:v875-2|123:1749,456:1750|123.123:875.1,456.456:875.2|k1|123|456.456
+876|k1:v876,k2:v876-2|123:1751,456:1752|123.123:876.1,456.456:876.2|k1|123|456.456
+877|k1:v877,k2:v877-2|123:1753,456:1754|123.123:877.1,456.456:877.2|k1|123|456.456
+878|k1:v878,k2:v878-2|123:1755,456:1756|123.123:878.1,456.456:878.2|k1|123|456.456
+879|k1:v879,k2:v879-2|123:1757,456:1758|123.123:879.1,456.456:879.2|k1|123|456.456
+880|k1:v880,k2:v880-2|123:1759,456:1760|123.123:880.1,456.456:880.2|k1|123|456.456
+881|k1:v881,k2:v881-2|123:1761,456:1762|123.123:881.1,456.456:881.2|k1|123|456.456
+882|k1:v882,k2:v882-2|123:1763,456:1764|123.123:882.1,456.456:882.2|k1|123|456.456
+883|k1:v883,k2:v883-2|123:1765,456:1766|123.123:883.1,456.456:883.2|k1|123|456.456
+884|k1:v884,k2:v884-2|123:1767,456:1768|123.123:884.1,456.456:884.2|k1|123|456.456
+885|k1:v885,k2:v885-2|123:1769,456:1770|123.123:885.1,456.456:885.2|k1|123|456.456
+886|k1:v886,k2:v886-2|123:1771,456:1772|123.123:886.1,456.456:886.2|k1|123|456.456
+887|k1:v887,k2:v887-2|123:1773,456:1774|123.123:887.1,456.456:887.2|k1|123|456.456
+888|k1:v888,k2:v888-2|123:1775,456:1776|123.123:888.1,456.456:888.2|k1|123|456.456
+889|k1:v889,k2:v889-2|123:1777,456:1778|123.123:889.1,456.456:889.2|k1|123|456.456
+890|k1:v890,k2:v890-2|123:1779,456:1780|123.123:890.1,456.456:890.2|k1|123|456.456
+891|k1:v891,k2:v891-2|123:1781,456:1782|123.123:891.1,456.456:891.2|k1|123|456.456
+892|k1:v892,k2:v892-2|123:1783,456:1784|123.123:892.1,456.456:892.2|k1|123|456.456
+893|k1:v893,k2:v893-2|123:1785,456:1786|123.123:893.1,456.456:893.2|k1|123|456.456
+894|k1:v894,k2:v894-2|123:1787,456:1788|123.123:894.1,456.456:894.2|k1|123|456.456
+895|k1:v895,k2:v895-2|123:1789,456:1790|123.123:895.1,456.456:895.2|k1|123|456.456
+896|k1:v896,k2:v896-2|123:1791,456:1792|123.123:896.1,456.456:896.2|k1|123|456.456
+897|k1:v897,k2:v897-2|123:1793,456:1794|123.123:897.1,456.456:897.2|k1|123|456.456
+898|k1:v898,k2:v898-2|123:1795,456:1796|123.123:898.1,456.456:898.2|k1|123|456.456
+899|k1:v899,k2:v899-2|123:1797,456:1798|123.123:899.1,456.456:899.2|k1|123|456.456
+900|k1:v900,k2:v900-2|123:1799,456:1800|123.123:900.1,456.456:900.2|k1|123|456.456
+901|k1:v901,k2:v901-2|123:1801,456:1802|123.123:901.1,456.456:901.2|k1|123|456.456
+902|k1:v902,k2:v902-2|123:1803,456:1804|123.123:902.1,456.456:902.2|k1|123|456.456
+903|k1:v903,k2:v903-2|123:1805,456:1806|123.123:903.1,456.456:903.2|k1|123|456.456
+904|k1:v904,k2:v904-2|123:1807,456:1808|123.123:904.1,456.456:904.2|k1|123|456.456
+905|k1:v905,k2:v905-2|123:1809,456:1810|123.123:905.1,456.456:905.2|k1|123|456.456
+906|k1:v906,k2:v906-2|123:1811,456:1812|123.123:906.1,456.456:906.2|k1|123|456.456
+907|k1:v907,k2:v907-2|123:1813,456:1814|123.123:907.1,456.456:907.2|k1|123|456.456
+908|k1:v908,k2:v908-2|123:1815,456:1816|123.123:908.1,456.456:908.2|k1|123|456.456
+909|k1:v909,k2:v909-2|123:1817,456:1818|123.123:909.1,456.456:909.2|k1|123|456.456
+910|k1:v910,k2:v910-2|123:1819,456:1820|123.123:910.1,456.456:910.2|k1|123|456.456
+911|k1:v911,k2:v911-2|123:1821,456:1822|123.123:911.1,456.456:911.2|k1|123|456.456
+912|k1:v912,k2:v912-2|123:1823,456:1824|123.123:912.1,456.456:912.2|k1|123|456.456
+913|k1:v913,k2:v913-2|123:1825,456:1826|123.123:913.1,456.456:913.2|k1|123|456.456
+914|k1:v914,k2:v914-2|123:1827,456:1828|123.123:914.1,456.456:914.2|k1|123|456.456
+915|k1:v915,k2:v915-2|123:1829,456:1830|123.123:915.1,456.456:915.2|k1|123|456.456
+916|k1:v916,k2:v916-2|123:1831,456:1832|123.123:916.1,456.456:916.2|k1|123|456.456
+917|k1:v917,k2:v917-2|123:1833,456:1834|123.123:917.1,456.456:917.2|k1|123|456.456
+918|k1:v918,k2:v918-2|123:1835,456:1836|123.123:918.1,456.456:918.2|k1|123|456.456
+919|k1:v919,k2:v919-2|123:1837,456:1838|123.123:919.1,456.456:919.2|k1|123|456.456
+920|k1:v920,k2:v920-2|123:1839,456:1840|123.123:920.1,456.456:920.2|k1|123|456.456
+921|k1:v921,k2:v921-2|123:1841,456:1842|123.123:921.1,456.456:921.2|k1|123|456.456
+922|k1:v922,k2:v922-2|123:1843,456:1844|123.123:922.1,456.456:922.2|k1|123|456.456
+923|k1:v923,k2:v923-2|123:1845,456:1846|123.123:923.1,456.456:923.2|k1|123|456.456
+924|k1:v924,k2:v924-2|123:1847,456:1848|123.123:924.1,456.456:924.2|k1|123|456.456
+925|k1:v925,k2:v925-2|123:1849,456:1850|123.123:925.1,456.456:925.2|k1|123|456.456
+926|k1:v926,k2:v926-2|123:1851,456:1852|123.123:926.1,456.456:926.2|k1|123|456.456
+927|k1:v927,k2:v927-2|123:1853,456:1854|123.123:927.1,456.456:927.2|k1|123|456.456
+928|k1:v928,k2:v928-2|123:1855,456:1856|123.123:928.1,456.456:928.2|k1|123|456.456
+929|k1:v929,k2:v929-2|123:1857,456:1858|123.123:929.1,456.456:929.2|k1|123|456.456
+930|k1:v930,k2:v930-2|123:1859,456:1860|123.123:930.1,456.456:930.2|k1|123|456.456
+931|k1:v931,k2:v931-2|123:1861,456:1862|123.123:931.1,456.456:931.2|k1|123|456.456
+932|k1:v932,k2:v932-2|123:1863,456:1864|123.123:932.1,456.456:932.2|k1|123|456.456
+933|k1:v933,k2:v933-2|123:1865,456:1866|123.123:933.1,456.456:933.2|k1|123|456.456
+934|k1:v934,k2:v934-2|123:1867,456:1868|123.123:934.1,456.456:934.2|k1|123|456.456
+935|k1:v935,k2:v935-2|123:1869,456:1870|123.123:935.1,456.456:935.2|k1|123|456.456
+936|k1:v936,k2:v936-2|123:1871,456:1872|123.123:936.1,456.456:936.2|k1|123|456.456
+937|k1:v937,k2:v937-2|123:1873,456:1874|123.123:937.1,456.456:937.2|k1|123|456.456
+938|k1:v938,k2:v938-2|123:1875,456:1876|123.123:938.1,456.456:938.2|k1|123|456.456
+939|k1:v939,k2:v939-2|123:1877,456:1878|123.123:939.1,456.456:939.2|k1|123|456.456
+940|k1:v940,k2:v940-2|123:1879,456:1880|123.123:940.1,456.456:940.2|k1|123|456.456
+941|k1:v941,k2:v941-2|123:1881,456:1882|123.123:941.1,456.456:941.2|k1|123|456.456
+942|k1:v942,k2:v942-2|123:1883,456:1884|123.123:942.1,456.456:942.2|k1|123|456.456
+943|k1:v943,k2:v943-2|123:1885,456:1886|123.123:943.1,456.456:943.2|k1|123|456.456
+944|k1:v944,k2:v944-2|123:1887,456:1888|123.123:944.1,456.456:944.2|k1|123|456.456
+945|k1:v945,k2:v945-2|123:1889,456:1890|123.123:945.1,456.456:945.2|k1|123|456.456
+946|k1:v946,k2:v946-2|123:1891,456:1892|123.123:946.1,456.456:946.2|k1|123|456.456
+947|k1:v947,k2:v947-2|123:1893,456:1894|123.123:947.1,456.456:947.2|k1|123|456.456
+948|k1:v948,k2:v948-2|123:1895,456:1896|123.123:948.1,456.456:948.2|k1|123|456.456
+949|k1:v949,k2:v949-2|123:1897,456:1898|123.123:949.1,456.456:949.2|k1|123|456.456
+950|k1:v950,k2:v950-2|123:1899,456:1900|123.123:950.1,456.456:950.2|k1|123|456.456
+951|k1:v951,k2:v951-2|123:1901,456:1902|123.123:951.1,456.456:951.2|k1|123|456.456
+952|k1:v952,k2:v952-2|123:1903,456:1904|123.123:952.1,456.456:952.2|k1|123|456.456
+953|k1:v953,k2:v953-2|123:1905,456:1906|123.123:953.1,456.456:953.2|k1|123|456.456
+954|k1:v954,k2:v954-2|123:1907,456:1908|123.123:954.1,456.456:954.2|k1|123|456.456
+955|k1:v955,k2:v955-2|123:1909,456:1910|123.123:955.1,456.456:955.2|k1|123|456.456
+956|k1:v956,k2:v956-2|123:1911,456:1912|123.123:956.1,456.456:956.2|k1|123|456.456
+957|k1:v957,k2:v957-2|123:1913,456:1914|123.123:957.1,456.456:957.2|k1|123|456.456
+958|k1:v958,k2:v958-2|123:1915,456:1916|123.123:958.1,456.456:958.2|k1|123|456.456
+959|k1:v959,k2:v959-2|123:1917,456:1918|123.123:959.1,456.456:959.2|k1|123|456.456
+960|k1:v960,k2:v960-2|123:1919,456:1920|123.123:960.1,456.456:960.2|k1|123|456.456
+961|k1:v961,k2:v961-2|123:1921,456:1922|123.123:961.1,456.456:961.2|k1|123|456.456
+962|k1:v962,k2:v962-2|123:1923,456:1924|123.123:962.1,456.456:962.2|k1|123|456.456
+963|k1:v963,k2:v963-2|123:1925,456:1926|123.123:963.1,456.456:963.2|k1|123|456.456
+964|k1:v964,k2:v964-2|123:1927,456:1928|123.123:964.1,456.456:964.2|k1|123|456.456
+965|k1:v965,k2:v965-2|123:1929,456:1930|123.123:965.1,456.456:965.2|k1|123|456.456
+966|k1:v966,k2:v966-2|123:1931,456:1932|123.123:966.1,456.456:966.2|k1|123|456.456
+967|k1:v967,k2:v967-2|123:1933,456:1934|123.123:967.1,456.456:967.2|k1|123|456.456
+968|k1:v968,k2:v968-2|123:1935,456:1936|123.123:968.1,456.456:968.2|k1|123|456.456
+969|k1:v969,k2:v969-2|123:1937,456:1938|123.123:969.1,456.456:969.2|k1|123|456.456
+970|k1:v970,k2:v970-2|123:1939,456:1940|123.123:970.1,456.456:970.2|k1|123|456.456
+971|k1:v971,k2:v971-2|123:1941,456:1942|123.123:971.1,456.456:971.2|k1|123|456.456
+972|k1:v972,k2:v972-2|123:1943,456:1944|123.123:972.1,456.456:972.2|k1|123|456.456
+973|k1:v973,k2:v973-2|123:1945,456:1946|123.123:973.1,456.456:973.2|k1|123|456.456
+974|k1:v974,k2:v974-2|123:1947,456:1948|123.123:974.1,456.456:974.2|k1|123|456.456
+975|k1:v975,k2:v975-2|123:1949,456:1950|123.123:975.1,456.456:975.2|k1|123|456.456
+976|k1:v976,k2:v976-2|123:1951,456:1952|123.123:976.1,456.456:976.2|k1|123|456.456
+977|k1:v977,k2:v977-2|123:1953,456:1954|123.123:977.1,456.456:977.2|k1|123|456.456
+978|k1:v978,k2:v978-2|123:1955,456:1956|123.123:978.1,456.456:978.2|k1|123|456.456
+979|k1:v979,k2:v979-2|123:1957,456:1958|123.123:979.1,456.456:979.2|k1|123|456.456
+980|k1:v980,k2:v980-2|123:1959,456:1960|123.123:980.1,456.456:980.2|k1|123|456.456
+981|k1:v981,k2:v981-2|123:1961,456:1962|123.123:981.1,456.456:981.2|k1|123|456.456
+982|k1:v982,k2:v982-2|123:1963,456:1964|123.123:982.1,456.456:982.2|k1|123|456.456
+983|k1:v983,k2:v983-2|123:1965,456:1966|123.123:983.1,456.456:983.2|k1|123|456.456
+984|k1:v984,k2:v984-2|123:1967,456:1968|123.123:984.1,456.456:984.2|k1|123|456.456
+985|k1:v985,k2:v985-2|123:1969,456:1970|123.123:985.1,456.456:985.2|k1|123|456.456
+986|k1:v986,k2:v986-2|123:1971,456:1972|123.123:986.1,456.456:986.2|k1|123|456.456
+987|k1:v987,k2:v987-2|123:1973,456:1974|123.123:987.1,456.456:987.2|k1|123|456.456
+988|k1:v988,k2:v988-2|123:1975,456:1976|123.123:988.1,456.456:988.2|k1|123|456.456
+989|k1:v989,k2:v989-2|123:1977,456:1978|123.123:989.1,456.456:989.2|k1|123|456.456
+990|k1:v990,k2:v990-2|123:1979,456:1980|123.123:990.1,456.456:990.2|k1|123|456.456
+991|k1:v991,k2:v991-2|123:1981,456:1982|123.123:991.1,456.456:991.2|k1|123|456.456
+992|k1:v992,k2:v992-2|123:1983,456:1984|123.123:992.1,456.456:992.2|k1|123|456.456
+993|k1:v993,k2:v993-2|123:1985,456:1986|123.123:993.1,456.456:993.2|k1|123|456.456
+994|k1:v994,k2:v994-2|123:1987,456:1988|123.123:994.1,456.456:994.2|k1|123|456.456
+995|k1:v995,k2:v995-2|123:1989,456:1990|123.123:995.1,456.456:995.2|k1|123|456.456
+996|k1:v996,k2:v996-2|123:1991,456:1992|123.123:996.1,456.456:996.2|k1|123|456.456
+997|k1:v997,k2:v997-2|123:1993,456:1994|123.123:997.1,456.456:997.2|k1|123|456.456
+998|k1:v998,k2:v998-2|123:1995,456:1996|123.123:998.1,456.456:998.2|k1|123|456.456
+999|k1:v999,k2:v999-2|123:1997,456:1998|123.123:999.1,456.456:999.2|k1|123|456.456
+1000|k1:v1000,k2:v1000-2|123:1999,456:2000|123.123:1000.1,456.456:1000.2|k1|123|456.456
+1001|k1:v1001,k2:v1001-2|123:2001,456:2002|123.123:1001.1,456.456:1001.2|k1|123|456.456
+1002|k1:v1002,k2:v1002-2|123:2003,456:2004|123.123:1002.1,456.456:1002.2|k1|123|456.456
+1003|k1:v1003,k2:v1003-2|123:2005,456:2006|123.123:1003.1,456.456:1003.2|k1|123|456.456
+1004|k1:v1004,k2:v1004-2|123:2007,456:2008|123.123:1004.1,456.456:1004.2|k1|123|456.456
+1005|k1:v1005,k2:v1005-2|123:2009,456:2010|123.123:1005.1,456.456:1005.2|k1|123|456.456
+1006|k1:v1006,k2:v1006-2|123:2011,456:2012|123.123:1006.1,456.456:1006.2|k1|123|456.456
+1007|k1:v1007,k2:v1007-2|123:2013,456:2014|123.123:1007.1,456.456:1007.2|k1|123|456.456
+1008|k1:v1008,k2:v1008-2|123:2015,456:2016|123.123:1008.1,456.456:1008.2|k1|123|456.456
+1009|k1:v1009,k2:v1009-2|123:2017,456:2018|123.123:1009.1,456.456:1009.2|k1|123|456.456
+1010|k1:v1010,k2:v1010-2|123:2019,456:2020|123.123:1010.1,456.456:1010.2|k1|123|456.456
+1011|k1:v1011,k2:v1011-2|123:2021,456:2022|123.123:1011.1,456.456:1011.2|k1|123|456.456
+1012|k1:v1012,k2:v1012-2|123:2023,456:2024|123.123:1012.1,456.456:1012.2|k1|123|456.456
+1013|k1:v1013,k2:v1013-2|123:2025,456:2026|123.123:1013.1,456.456:1013.2|k1|123|456.456
+1014|k1:v1014,k2:v1014-2|123:2027,456:2028|123.123:1014.1,456.456:1014.2|k1|123|456.456
+1015|k1:v1015,k2:v1015-2|123:2029,456:2030|123.123:1015.1,456.456:1015.2|k1|123|456.456
+1016|k1:v1016,k2:v1016-2|123:2031,456:2032|123.123:1016.1,456.456:1016.2|k1|123|456.456
+1017|k1:v1017,k2:v1017-2|123:2033,456:2034|123.123:1017.1,456.456:1017.2|k1|123|456.456
+1018|k1:v1018,k2:v1018-2|123:2035,456:2036|123.123:1018.1,456.456:1018.2|k1|123|456.456
+1019|k1:v1019,k2:v1019-2|123:2037,456:2038|123.123:1019.1,456.456:1019.2|k1|123|456.456
+1020|k1:v1020,k2:v1020-2|123:2039,456:2040|123.123:1020.1,456.456:1020.2|k1|123|456.456
+1021|k1:v1021,k2:v1021-2|123:2041,456:2042|123.123:1021.1,456.456:1021.2|k1|123|456.456
+1022|k1:v1022,k2:v1022-2|123:2043,456:2044|123.123:1022.1,456.456:1022.2|k1|123|456.456
+1023|k1:v1023,k2:v1023-2|123:2045,456:2046|123.123:1023.1,456.456:1023.2|k1|123|456.456
+1024|k1:v1024,k2:v1024-2|123:2047,456:2048|123.123:1024.1,456.456:1024.2|k1|123|456.456
+1025|k1:v1025,k2:v1025-2|123:2049,456:2050|123.123:1025.1,456.456:1025.2|k1111|111|111.111
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/hive/blob/a6fab143/itests/src/test/resources/testconfiguration.properties
----------------------------------------------------------------------
diff --git a/itests/src/test/resources/testconfiguration.properties b/itests/src/test/resources/testconfiguration.properties
index 2bf64dc..76d18ed 100644
--- a/itests/src/test/resources/testconfiguration.properties
+++ b/itests/src/test/resources/testconfiguration.properties
@@ -79,6 +79,7 @@ minillap.shared.query.files=insert_into1.q,\
   parallel_colstats.q,\
   parquet_types_vectorization.q,\
   parquet_complex_types_vectorization.q,\
+  parquet_map_type_vectorization.q,\
   union_type_chk.q,\
   cte_2.q,\
   cte_4.q,\

http://git-wip-us.apache.org/repos/asf/hive/blob/a6fab143/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorExpressionDescriptor.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorExpressionDescriptor.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorExpressionDescriptor.java
index 7a434b3..f71b2d4 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorExpressionDescriptor.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorExpressionDescriptor.java
@@ -78,7 +78,8 @@ public class VectorExpressionDescriptor {
     BINARY                  (0x400),
     STRUCT                  (0x800),
     DECIMAL_64              (0x1000),
-    LIST                    (0X2000),
+    LIST                    (0x2000),
+    MAP                     (0x4000),
     INT_DECIMAL_64_FAMILY   (INT_FAMILY.value | DECIMAL_64.value),
     DATETIME_FAMILY         (DATE.value | TIMESTAMP.value),
     INTERVAL_FAMILY         (INTERVAL_YEAR_MONTH.value | INTERVAL_DAY_TIME.value),
@@ -130,6 +131,8 @@ public class VectorExpressionDescriptor {
         return STRUCT;
       } else if (VectorizationContext.listTypePattern.matcher(lower).matches()) {
         return LIST;
+      } else if (VectorizationContext.mapTypePattern.matcher(lower).matches()) {
+        return MAP;
       } else if (lower.equals("void")) {
         // The old code let void through...
         return INT_FAMILY;


[2/3] hive git commit: HIVE-18159: Vectorization: Support Map type in MapWork (Colin Ma, reviewed by Ferdinand Xu)

Posted by xu...@apache.org.
http://git-wip-us.apache.org/repos/asf/hive/blob/a6fab143/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java
index 0ad6816..9938fb0 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java
@@ -389,6 +389,9 @@ public class VectorizationContext {
   public static final Pattern listTypePattern = Pattern.compile("array.*",
       Pattern.CASE_INSENSITIVE);
 
+  public static final Pattern mapTypePattern = Pattern.compile("map.*",
+      Pattern.CASE_INSENSITIVE);
+
   //Map column number to type
   private OutputColumnManager ocm;
 
@@ -3265,6 +3268,8 @@ public class VectorizationContext {
       return "Struct";
     case LIST:
       return "List";
+    case MAP:
+      return "Map";
     default:
       throw new HiveException("Unexpected hive type name " + hiveTypeName);
     }

http://git-wip-us.apache.org/repos/asf/hive/blob/a6fab143/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexBase.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexBase.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexBase.java
new file mode 100644
index 0000000..44ebbf3
--- /dev/null
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexBase.java
@@ -0,0 +1,89 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.ql.exec.vector.expressions;
+
+import org.apache.hadoop.hive.ql.exec.vector.ColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.MapColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
+
+/**
+ * Superclass to support vectorized functions that take a parameter as key of Map
+ * and return the value of Map.
+ */
+public abstract class VectorUDFMapIndexBase extends VectorExpression {
+
+  private static final long serialVersionUID = 1L;
+
+  public VectorUDFMapIndexBase() {
+    super();
+  }
+
+  public VectorUDFMapIndexBase(int outputColumnNum) {
+    super(outputColumnNum);
+  }
+
+  /**
+   * The index array of MapColumnVector is used to get the value from MapColumnVector based on the
+   * index, the following are the steps to get it:
+   *   1. Get the current key which is a scalar or from a ColumnVector.
+   *   2. Compare the current key and the key from MapColumnVector.
+   *   3. Set the index of MapColumnVector to the result array if the keys are same.
+   */
+  protected int[] getMapValueIndex(MapColumnVector mapV, VectorizedRowBatch batch) {
+    int[] indexArray = new int[VectorizedRowBatch.DEFAULT_SIZE];
+    for (int i = 0; i < batch.size; i++) {
+      boolean findKey = false;
+      int offset = (batch.selectedInUse) ? batch.selected[i] : i;
+      Object columnKey = getCurrentKey(offset);
+      for (int j = 0; j < mapV.lengths[offset]; j++) {
+        int index = (int)(mapV.offsets[offset] + j);
+        Object tempKey = getKeyByIndex(mapV.keys, index);
+        if (compareKey(columnKey, tempKey)) {
+          indexArray[offset] = j;
+          findKey = true;
+          break;
+        }
+      }
+      if (!findKey) {
+        indexArray[offset] = -1;
+      }
+      if (mapV.isRepeating) {
+        break;
+      }
+    }
+    return indexArray;
+  }
+
+  protected boolean compareKey(Object columnKey, Object otherKey) {
+    if (columnKey == null && otherKey == null) {
+      return true;
+    } else if (columnKey != null && otherKey != null) {
+      return compareKeyInternal(columnKey, otherKey);
+    } else {
+      return false;
+    }
+  }
+
+  protected boolean compareKeyInternal(Object columnKey, Object otherKey) {
+    return columnKey.equals(otherKey);
+  }
+
+  abstract Object getKeyByIndex(ColumnVector cv, int index);
+
+  abstract Object getCurrentKey(int index);
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/a6fab143/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexBaseCol.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexBaseCol.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexBaseCol.java
new file mode 100644
index 0000000..b55bd98
--- /dev/null
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexBaseCol.java
@@ -0,0 +1,119 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.exec.vector.expressions;
+
+import org.apache.hadoop.hive.ql.exec.vector.ColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.MapColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
+
+/**
+ * Superclass to support vectorized functions that take a column value as key of Map
+ * and return the value of Map.
+ */
+public abstract class VectorUDFMapIndexBaseCol extends VectorUDFMapIndexBase {
+
+  private static final long serialVersionUID = 1L;
+
+  private int mapColumnNum;
+  private int indexColumnNum;
+  private ColumnVector indexColumnVector;
+
+  public VectorUDFMapIndexBaseCol() {
+    super();
+  }
+
+  public VectorUDFMapIndexBaseCol(int mapColumnNum, int indexColumnNum, int outputColumnNum) {
+    super(outputColumnNum);
+    this.mapColumnNum = mapColumnNum;
+    this.indexColumnNum = indexColumnNum;
+  }
+
+  @Override
+  public void evaluate(VectorizedRowBatch batch) {
+    if (childExpressions != null) {
+      super.evaluateChildren(batch);
+    }
+
+    ColumnVector outV = batch.cols[outputColumnNum];
+    MapColumnVector mapV = (MapColumnVector) batch.cols[mapColumnNum];
+    // indexColumnVector includes the keys of Map
+    indexColumnVector = batch.cols[indexColumnNum];
+
+    outV.noNulls = true;
+    int[] mapValueIndex;
+    if (mapV.isRepeating) {
+      if (mapV.isNull[0]) {
+        outV.isNull[0] = true;
+        outV.noNulls = false;
+        outV.isRepeating = true;
+      } else {
+        mapValueIndex = getMapValueIndex(mapV, batch);
+        if (indexColumnVector.isRepeating) {
+          // the key is not found in MapColumnVector, set the output as null ColumnVector
+          if (mapValueIndex[0] == -1) {
+            outV.isNull[0] = true;
+            outV.noNulls = false;
+          } else {
+            // the key is found in MapColumnVector, set the value
+            outV.setElement(0, (int) (mapV.offsets[0] + mapValueIndex[0]), mapV.values);
+            outV.isNull[0] = false;
+            outV.noNulls = true;
+          }
+          outV.isRepeating = true;
+        } else {
+          setUnRepeatingOutVector(batch, mapV, outV, mapValueIndex);
+        }
+      }
+    } else {
+      mapValueIndex = getMapValueIndex(mapV, batch);
+      setUnRepeatingOutVector(batch, mapV, outV, mapValueIndex);
+    }
+  }
+
+  /**
+   * Set the output based on the index array of MapColumnVector.
+   */
+  private void setUnRepeatingOutVector(VectorizedRowBatch batch, MapColumnVector mapV,
+      ColumnVector outV, int[] mapValueIndex) {
+    for (int i = 0; i < batch.size; i++) {
+      int j = (batch.selectedInUse) ? batch.selected[i] : i;
+      if (mapV.isNull[j] || mapValueIndex[j] == -1) {
+        outV.isNull[j] = true;
+        outV.noNulls = false;
+      } else {
+        outV.setElement(j, (int) (mapV.offsets[j] + mapValueIndex[j]), mapV.values);
+        outV.isNull[j] = false;
+      }
+    }
+    outV.isRepeating = false;
+  }
+
+  @Override
+  protected Object getCurrentKey(int index) {
+    return getKeyByIndex(indexColumnVector, index);
+  }
+
+  public int getMapColumnNum() {
+    return mapColumnNum;
+  }
+
+  public int getIndexColumnNum() {
+    return indexColumnNum;
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/a6fab143/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexBaseScalar.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexBaseScalar.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexBaseScalar.java
new file mode 100644
index 0000000..512f6eb
--- /dev/null
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexBaseScalar.java
@@ -0,0 +1,91 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.exec.vector.expressions;
+
+import org.apache.hadoop.hive.ql.exec.vector.ColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.MapColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
+
+/**
+ * Superclass to support vectorized functions that take a scalar as key of Map
+ * and return the value of Map.
+ */
+public abstract class VectorUDFMapIndexBaseScalar extends VectorUDFMapIndexBase {
+
+  private static final long serialVersionUID = 1L;
+
+  private int mapColumnNum;
+
+  public VectorUDFMapIndexBaseScalar() {
+    super();
+  }
+
+  public VectorUDFMapIndexBaseScalar(int mapColumnNum, int outputColumnNum) {
+    super(outputColumnNum);
+    this.mapColumnNum = mapColumnNum;
+  }
+
+  @Override
+  public void evaluate(VectorizedRowBatch batch) {
+    if (childExpressions != null) {
+      super.evaluateChildren(batch);
+    }
+
+    ColumnVector outV = batch.cols[outputColumnNum];
+    MapColumnVector mapV = (MapColumnVector) batch.cols[mapColumnNum];
+
+    outV.noNulls = true;
+    int[] mapValueIndex;
+    if (mapV.isRepeating) {
+      if (mapV.isNull[0]) {
+        outV.isNull[0] = true;
+        outV.noNulls = false;
+      } else {
+        mapValueIndex = getMapValueIndex(mapV, batch);
+        if (mapValueIndex[0] == -1) {
+          // the key is not found in MapColumnVector, set the output as null ColumnVector
+          outV.isNull[0] = true;
+          outV.noNulls = false;
+        } else {
+          // the key is found in MapColumnVector, set the value
+          outV.setElement(0, (int) (mapV.offsets[0] + mapValueIndex[0]), mapV.values);
+          outV.noNulls = true;
+        }
+      }
+      outV.isRepeating = true;
+    } else {
+      mapValueIndex = getMapValueIndex(mapV, batch);
+      for (int i = 0; i < batch.size; i++) {
+        int j = (batch.selectedInUse) ? batch.selected[i] : i;
+        if (mapV.isNull[j] || mapValueIndex[j] == -1) {
+          outV.isNull[j] = true;
+          outV.noNulls = false;
+        } else {
+          outV.setElement(j, (int) (mapV.offsets[j] + mapValueIndex[j]), mapV.values);
+          outV.isNull[j] = false;
+        }
+      }
+      outV.isRepeating = false;
+    }
+  }
+
+  public int getMapColumnNum() {
+    return mapColumnNum;
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/a6fab143/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexDoubleCol.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexDoubleCol.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexDoubleCol.java
new file mode 100644
index 0000000..34f73a4
--- /dev/null
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexDoubleCol.java
@@ -0,0 +1,63 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.exec.vector.expressions;
+
+import org.apache.hadoop.hive.ql.exec.vector.ColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.DoubleColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor;
+
+/**
+ * Returns value of Map.
+ * Extends {@link VectorUDFMapIndexBaseCol}
+ */
+public class VectorUDFMapIndexDoubleCol extends VectorUDFMapIndexBaseCol {
+
+  public VectorUDFMapIndexDoubleCol() {
+    super();
+  }
+
+  public VectorUDFMapIndexDoubleCol(int mapColumnNum, int indexColumnNum, int outputColumnNum) {
+    super(mapColumnNum, indexColumnNum, outputColumnNum);
+  }
+
+  @Override
+  public String vectorExpressionParameters() {
+    return getColumnParamString(0, getMapColumnNum()) + ", key: "
+        + getColumnParamString(1, getIndexColumnNum());
+  }
+
+  @Override
+  public VectorExpressionDescriptor.Descriptor getDescriptor() {
+    return (new VectorExpressionDescriptor.Builder())
+        .setMode(
+            VectorExpressionDescriptor.Mode.PROJECTION)
+        .setNumArguments(2)
+        .setArgumentTypes(
+            VectorExpressionDescriptor.ArgumentType.MAP,
+            VectorExpressionDescriptor.ArgumentType.FLOAT_FAMILY)
+        .setInputExpressionTypes(
+            VectorExpressionDescriptor.InputExpressionType.COLUMN,
+            VectorExpressionDescriptor.InputExpressionType.COLUMN).build();
+  }
+
+  @Override
+  protected Object getKeyByIndex(ColumnVector cv, int index) {
+    return ((DoubleColumnVector) cv).vector[index];
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/a6fab143/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexDoubleScalar.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexDoubleScalar.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexDoubleScalar.java
new file mode 100644
index 0000000..1abcdbe
--- /dev/null
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexDoubleScalar.java
@@ -0,0 +1,76 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.exec.vector.expressions;
+
+import org.apache.hadoop.hive.common.type.HiveDecimal;
+import org.apache.hadoop.hive.ql.exec.vector.ColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.DoubleColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor;
+
+/**
+ * Returns value of Map.
+ * Extends {@link VectorUDFMapIndexBaseScalar}
+ */
+public class VectorUDFMapIndexDoubleScalar extends VectorUDFMapIndexBaseScalar {
+
+  private HiveDecimal key;
+
+  public VectorUDFMapIndexDoubleScalar() {
+    super();
+  }
+
+  public VectorUDFMapIndexDoubleScalar(int mapColumnNum, HiveDecimal key, int outputColumnNum) {
+    super(mapColumnNum, outputColumnNum);
+    this.key = key;
+  }
+
+  @Override
+  public String vectorExpressionParameters() {
+    return getColumnParamString(0, getMapColumnNum()) + ", key: " + key;
+  }
+
+  @Override
+  public VectorExpressionDescriptor.Descriptor getDescriptor() {
+    return (new VectorExpressionDescriptor.Builder())
+        .setMode(
+            VectorExpressionDescriptor.Mode.PROJECTION)
+        .setNumArguments(2)
+        .setArgumentTypes(
+            VectorExpressionDescriptor.ArgumentType.MAP,
+            VectorExpressionDescriptor.ArgumentType.DECIMAL)
+        .setInputExpressionTypes(
+            VectorExpressionDescriptor.InputExpressionType.COLUMN,
+            VectorExpressionDescriptor.InputExpressionType.SCALAR).build();
+  }
+
+  @Override
+  protected Object getKeyByIndex(ColumnVector cv, int index) {
+    return ((DoubleColumnVector) cv).vector[index];
+  }
+
+  @Override
+  public Object getCurrentKey(int index) {
+    return key;
+  }
+
+  @Override
+  protected boolean compareKeyInternal(Object columnKey, Object otherKey) {
+    return otherKey.equals(((HiveDecimal) columnKey).doubleValue());
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/a6fab143/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexLongCol.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexLongCol.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexLongCol.java
new file mode 100644
index 0000000..f1c4a69
--- /dev/null
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexLongCol.java
@@ -0,0 +1,63 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.exec.vector.expressions;
+
+import org.apache.hadoop.hive.ql.exec.vector.ColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor;
+
+/**
+ * Returns value of Map.
+ * Extends {@link VectorUDFMapIndexBaseCol}
+ */
+public class VectorUDFMapIndexLongCol extends VectorUDFMapIndexBaseCol {
+
+  public VectorUDFMapIndexLongCol() {
+    super();
+  }
+
+  public VectorUDFMapIndexLongCol(int mapColumnNum, int indexColumnNum, int outputColumnNum) {
+    super(mapColumnNum, indexColumnNum, outputColumnNum);
+  }
+
+  @Override
+  public String vectorExpressionParameters() {
+    return getColumnParamString(0, getMapColumnNum()) + ", key: "
+        + getColumnParamString(1, getIndexColumnNum());
+  }
+
+  @Override
+  public VectorExpressionDescriptor.Descriptor getDescriptor() {
+    return (new VectorExpressionDescriptor.Builder())
+        .setMode(
+            VectorExpressionDescriptor.Mode.PROJECTION)
+        .setNumArguments(2)
+        .setArgumentTypes(
+            VectorExpressionDescriptor.ArgumentType.MAP,
+            VectorExpressionDescriptor.ArgumentType.INT_FAMILY)
+        .setInputExpressionTypes(
+            VectorExpressionDescriptor.InputExpressionType.COLUMN,
+            VectorExpressionDescriptor.InputExpressionType.COLUMN).build();
+  }
+
+  @Override
+  protected Object getKeyByIndex(ColumnVector cv, int index) {
+    return ((LongColumnVector) cv).vector[index];
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/a6fab143/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexLongScalar.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexLongScalar.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexLongScalar.java
new file mode 100644
index 0000000..eb66826
--- /dev/null
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexLongScalar.java
@@ -0,0 +1,70 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.exec.vector.expressions;
+
+import org.apache.hadoop.hive.ql.exec.vector.ColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor;
+
+/**
+ * Returns value of Map.
+ * Extends {@link VectorUDFMapIndexBaseScalar}
+ */
+public class VectorUDFMapIndexLongScalar extends VectorUDFMapIndexBaseScalar {
+
+  private long key;
+
+  public VectorUDFMapIndexLongScalar() {
+    super();
+  }
+
+  public VectorUDFMapIndexLongScalar(int mapColumnNum, long key, int outputColumnNum) {
+    super(mapColumnNum, outputColumnNum);
+    this.key = key;
+  }
+
+  @Override
+  public String vectorExpressionParameters() {
+    return getColumnParamString(0, getMapColumnNum()) + ", key: " + key;
+  }
+
+  @Override
+  public VectorExpressionDescriptor.Descriptor getDescriptor() {
+    return (new VectorExpressionDescriptor.Builder())
+        .setMode(
+            VectorExpressionDescriptor.Mode.PROJECTION)
+        .setNumArguments(2)
+        .setArgumentTypes(
+            VectorExpressionDescriptor.ArgumentType.MAP,
+            VectorExpressionDescriptor.ArgumentType.INT_FAMILY)
+        .setInputExpressionTypes(
+            VectorExpressionDescriptor.InputExpressionType.COLUMN,
+            VectorExpressionDescriptor.InputExpressionType.SCALAR).build();
+  }
+
+  @Override
+  protected Object getKeyByIndex(ColumnVector cv, int index) {
+    return ((LongColumnVector) cv).vector[index];
+  }
+
+  @Override
+  public Object getCurrentKey(int index) {
+    return key;
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/a6fab143/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexStringCol.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexStringCol.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexStringCol.java
new file mode 100644
index 0000000..576ebe9
--- /dev/null
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexStringCol.java
@@ -0,0 +1,73 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.exec.vector.expressions;
+
+import org.apache.commons.lang.ArrayUtils;
+import org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.ColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor;
+
+import java.util.Arrays;
+
+/**
+ * Returns value of Map.
+ * Extends {@link VectorUDFMapIndexBaseCol}
+ */
+public class VectorUDFMapIndexStringCol extends VectorUDFMapIndexBaseCol {
+
+  public VectorUDFMapIndexStringCol() {
+    super();
+  }
+
+  public VectorUDFMapIndexStringCol(int mapColumnNum, int indexColumnNum, int outputColumnNum) {
+    super(mapColumnNum, indexColumnNum, outputColumnNum);
+  }
+
+  @Override
+  public String vectorExpressionParameters() {
+    return getColumnParamString(0, getMapColumnNum()) + ", key: "
+        + getColumnParamString(1, getIndexColumnNum());
+  }
+
+  @Override
+  public VectorExpressionDescriptor.Descriptor getDescriptor() {
+    return (new VectorExpressionDescriptor.Builder())
+        .setMode(
+            VectorExpressionDescriptor.Mode.PROJECTION)
+        .setNumArguments(2)
+        .setArgumentTypes(
+            VectorExpressionDescriptor.ArgumentType.MAP,
+            VectorExpressionDescriptor.ArgumentType.STRING_FAMILY)
+        .setInputExpressionTypes(
+            VectorExpressionDescriptor.InputExpressionType.COLUMN,
+            VectorExpressionDescriptor.InputExpressionType.COLUMN).build();
+  }
+
+  @Override
+  protected Object getKeyByIndex(ColumnVector cv, int index) {
+    BytesColumnVector bytesCV = (BytesColumnVector) cv;
+    return ArrayUtils.subarray(bytesCV.vector[index], bytesCV.start[index],
+        bytesCV.start[index] + bytesCV.length[index]);
+  }
+
+  @Override
+  protected boolean compareKeyInternal(Object columnKey, Object otherKey) {
+    return Arrays.equals((byte[])columnKey, (byte[]) otherKey);
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/a6fab143/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexStringScalar.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexStringScalar.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexStringScalar.java
new file mode 100644
index 0000000..7a87972
--- /dev/null
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorUDFMapIndexStringScalar.java
@@ -0,0 +1,80 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.exec.vector.expressions;
+
+import org.apache.commons.lang.ArrayUtils;
+import org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.ColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.VectorExpressionDescriptor;
+
+import java.util.Arrays;
+
+/**
+ * Returns value of Map.
+ * Extends {@link VectorUDFMapIndexBaseScalar}
+ */
+public class VectorUDFMapIndexStringScalar extends VectorUDFMapIndexBaseScalar {
+
+  private byte[] key;
+
+  public VectorUDFMapIndexStringScalar() {
+    super();
+  }
+
+  public VectorUDFMapIndexStringScalar(int mapColumnNum, byte[] key, int outputColumnNum) {
+    super(mapColumnNum, outputColumnNum);
+    this.key = key;
+  }
+
+  @Override
+  public String vectorExpressionParameters() {
+    return getColumnParamString(0, getMapColumnNum()) + ", key: " + new String(key);
+  }
+
+  @Override
+  public VectorExpressionDescriptor.Descriptor getDescriptor() {
+    return (new VectorExpressionDescriptor.Builder())
+        .setMode(
+            VectorExpressionDescriptor.Mode.PROJECTION)
+        .setNumArguments(2)
+        .setArgumentTypes(
+            VectorExpressionDescriptor.ArgumentType.MAP,
+            VectorExpressionDescriptor.ArgumentType.STRING_FAMILY)
+        .setInputExpressionTypes(
+            VectorExpressionDescriptor.InputExpressionType.COLUMN,
+            VectorExpressionDescriptor.InputExpressionType.SCALAR).build();
+  }
+
+  @Override
+  protected Object getKeyByIndex(ColumnVector cv, int index) {
+    BytesColumnVector bytesCV = (BytesColumnVector) cv;
+    return ArrayUtils.subarray(bytesCV.vector[index], bytesCV.start[index],
+        bytesCV.start[index] + bytesCV.length[index]);
+  }
+
+  @Override
+  public Object getCurrentKey(int index) {
+    return key;
+  }
+
+  @Override
+  protected boolean compareKeyInternal(Object columnKey, Object otherKey) {
+    return Arrays.equals((byte[])columnKey, (byte[]) otherKey);
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/a6fab143/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFIndex.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFIndex.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFIndex.java
index 3db96ec..e2f61bf 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFIndex.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFIndex.java
@@ -25,6 +25,12 @@ import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
 import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressions;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.ListIndexColColumn;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.ListIndexColScalar;
+import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFMapIndexDoubleCol;
+import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFMapIndexDoubleScalar;
+import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFMapIndexLongCol;
+import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFMapIndexLongScalar;
+import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFMapIndexStringCol;
+import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFMapIndexStringScalar;
 import org.apache.hadoop.hive.ql.metadata.HiveException;
 import org.apache.hadoop.hive.serde2.objectinspector.ListObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.MapObjectInspector;
@@ -40,7 +46,10 @@ import org.apache.hadoop.io.IntWritable;
  *
  */
 @Description(name = "index", value = "_FUNC_(a, n) - Returns the n-th element of a ")
-@VectorizedExpressions({ListIndexColScalar.class, ListIndexColColumn.class})
+@VectorizedExpressions({ListIndexColScalar.class, ListIndexColColumn.class,
+    VectorUDFMapIndexStringScalar.class, VectorUDFMapIndexLongScalar.class,
+    VectorUDFMapIndexDoubleScalar.class, VectorUDFMapIndexStringCol.class,
+    VectorUDFMapIndexLongCol.class, VectorUDFMapIndexDoubleCol.class})
 public class GenericUDFIndex extends GenericUDF {
 
   private transient MapObjectInspector mapOI;

http://git-wip-us.apache.org/repos/asf/hive/blob/a6fab143/ql/src/test/queries/clientpositive/parquet_map_type_vectorization.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/parquet_map_type_vectorization.q b/ql/src/test/queries/clientpositive/parquet_map_type_vectorization.q
new file mode 100644
index 0000000..1589545
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/parquet_map_type_vectorization.q
@@ -0,0 +1,73 @@
+set hive.mapred.mode=nonstrict;
+set hive.vectorized.execution.enabled=true;
+set hive.fetch.task.conversion=none;
+
+DROP TABLE parquet_map_type_staging;
+DROP TABLE parquet_map_type;
+
+CREATE TABLE parquet_map_type_staging (
+id int,
+stringMap map<string, string>,
+intMap map<int, int>,
+doubleMap map<double, double>,
+stringIndex string,
+intIndex int,
+doubleIndex double
+) ROW FORMAT DELIMITED
+  FIELDS TERMINATED BY '|'
+  COLLECTION ITEMS TERMINATED BY ','
+  MAP KEYS TERMINATED BY ':';
+
+CREATE TABLE parquet_map_type (
+id int,
+stringMap map<string, string>,
+intMap map<int, int>,
+doubleMap map<double, double>,
+stringIndex string,
+intIndex int,
+doubleIndex double
+) STORED AS PARQUET;
+
+-- test data size < 1024
+LOAD DATA LOCAL INPATH '../../data/files/parquet_vector_map_type.txt' OVERWRITE INTO TABLE parquet_map_type_staging;
+INSERT OVERWRITE TABLE parquet_map_type
+SELECT id, stringMap, intMap, doubleMap, stringIndex, intIndex, doubleIndex FROM parquet_map_type_staging where id < 1024;
+
+-- verify the row number
+select count(*) from parquet_map_type;
+-- test element select with constant and variable
+explain vectorization expression select stringMap, intMap, doubleMap, stringMap['k2'], intMap[456],
+doubleMap[123.123], stringMap[stringIndex], intMap[intIndex], doubleMap[doubleIndex] from parquet_map_type limit 10;
+select stringMap, intMap, doubleMap, stringMap['k2'], intMap[456], doubleMap[123.123],
+stringMap[stringIndex], intMap[intIndex], doubleMap[doubleIndex] from parquet_map_type limit 10;
+-- test complex select with map
+explain vectorization expression select sum(intMap[123]), sum(doubleMap[123.123]), stringMap['k1']
+from parquet_map_type where stringMap['k1'] like 'v100%' group by stringMap['k1'] order by stringMap['k1'] limit 10;
+select sum(intMap[123]), sum(doubleMap[123.123]), stringMap['k1']
+from parquet_map_type where stringMap['k1'] like 'v100%' group by stringMap['k1'] order by stringMap['k1'] limit 10;
+
+-- test data size = 1024
+INSERT OVERWRITE TABLE parquet_map_type
+SELECT id, stringMap, intMap, doubleMap, stringIndex, intIndex, doubleIndex FROM parquet_map_type_staging where id < 1025;
+
+-- verify the row number
+select count(*) from parquet_map_type;
+-- test element select with constant and variable
+select stringMap, intMap, doubleMap, stringMap['k2'], intMap[456], doubleMap[123.123],
+stringMap[stringIndex], intMap[intIndex], doubleMap[doubleIndex] from parquet_map_type limit 10;
+-- test complex select with map
+select sum(intMap[123]), sum(doubleMap[123.123]), stringMap['k1']
+from parquet_map_type where stringMap['k1'] like 'v100%' group by stringMap['k1'] order by stringMap['k1'] limit 10;
+
+-- test data size = 1025
+INSERT OVERWRITE TABLE parquet_map_type
+SELECT id, stringMap, intMap, doubleMap, stringIndex, intIndex, doubleIndex FROM parquet_map_type_staging;
+
+-- verify the row number
+select count(*) from parquet_map_type;
+-- test element select with constant and variable
+select stringMap, intMap, doubleMap, stringMap['k2'], intMap[456], doubleMap[123.123],
+stringMap[stringIndex], intMap[intIndex], doubleMap[doubleIndex] from parquet_map_type limit 10;
+-- test complex select with map
+select sum(intMap[123]), sum(doubleMap[123.123]), stringMap['k1']
+from parquet_map_type where stringMap['k1'] like 'v100%' group by stringMap['k1'] order by stringMap['k1'] limit 10;

http://git-wip-us.apache.org/repos/asf/hive/blob/a6fab143/ql/src/test/results/clientpositive/llap/parquet_map_type_vectorization.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/llap/parquet_map_type_vectorization.q.out b/ql/src/test/results/clientpositive/llap/parquet_map_type_vectorization.q.out
new file mode 100644
index 0000000..ae7db3f
--- /dev/null
+++ b/ql/src/test/results/clientpositive/llap/parquet_map_type_vectorization.q.out
@@ -0,0 +1,500 @@
+PREHOOK: query: DROP TABLE parquet_map_type_staging
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE parquet_map_type_staging
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: DROP TABLE parquet_map_type
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE parquet_map_type
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE parquet_map_type_staging (
+id int,
+stringMap map<string, string>,
+intMap map<int, int>,
+doubleMap map<double, double>,
+stringIndex string,
+intIndex int,
+doubleIndex double
+) ROW FORMAT DELIMITED
+  FIELDS TERMINATED BY '|'
+  COLLECTION ITEMS TERMINATED BY ','
+  MAP KEYS TERMINATED BY ':'
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@parquet_map_type_staging
+POSTHOOK: query: CREATE TABLE parquet_map_type_staging (
+id int,
+stringMap map<string, string>,
+intMap map<int, int>,
+doubleMap map<double, double>,
+stringIndex string,
+intIndex int,
+doubleIndex double
+) ROW FORMAT DELIMITED
+  FIELDS TERMINATED BY '|'
+  COLLECTION ITEMS TERMINATED BY ','
+  MAP KEYS TERMINATED BY ':'
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@parquet_map_type_staging
+PREHOOK: query: CREATE TABLE parquet_map_type (
+id int,
+stringMap map<string, string>,
+intMap map<int, int>,
+doubleMap map<double, double>,
+stringIndex string,
+intIndex int,
+doubleIndex double
+) STORED AS PARQUET
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@parquet_map_type
+POSTHOOK: query: CREATE TABLE parquet_map_type (
+id int,
+stringMap map<string, string>,
+intMap map<int, int>,
+doubleMap map<double, double>,
+stringIndex string,
+intIndex int,
+doubleIndex double
+) STORED AS PARQUET
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@parquet_map_type
+PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/parquet_vector_map_type.txt' OVERWRITE INTO TABLE parquet_map_type_staging
+PREHOOK: type: LOAD
+#### A masked pattern was here ####
+PREHOOK: Output: default@parquet_map_type_staging
+POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/parquet_vector_map_type.txt' OVERWRITE INTO TABLE parquet_map_type_staging
+POSTHOOK: type: LOAD
+#### A masked pattern was here ####
+POSTHOOK: Output: default@parquet_map_type_staging
+PREHOOK: query: INSERT OVERWRITE TABLE parquet_map_type
+SELECT id, stringMap, intMap, doubleMap, stringIndex, intIndex, doubleIndex FROM parquet_map_type_staging where id < 1024
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type_staging
+PREHOOK: Output: default@parquet_map_type
+POSTHOOK: query: INSERT OVERWRITE TABLE parquet_map_type
+SELECT id, stringMap, intMap, doubleMap, stringIndex, intIndex, doubleIndex FROM parquet_map_type_staging where id < 1024
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type_staging
+POSTHOOK: Output: default@parquet_map_type
+POSTHOOK: Lineage: parquet_map_type.doubleindex SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:doubleindex, type:double, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.doublemap SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:doublemap, type:map<double,double>, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.id SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:id, type:int, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.intindex SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:intindex, type:int, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.intmap SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:intmap, type:map<int,int>, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.stringindex SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:stringindex, type:string, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.stringmap SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:stringmap, type:map<string,string>, comment:null), ]
+PREHOOK: query: select count(*) from parquet_map_type
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+POSTHOOK: query: select count(*) from parquet_map_type
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+1023
+PREHOOK: query: explain vectorization expression select stringMap, intMap, doubleMap, stringMap['k2'], intMap[456],
+doubleMap[123.123], stringMap[stringIndex], intMap[intIndex], doubleMap[doubleIndex] from parquet_map_type limit 10
+PREHOOK: type: QUERY
+POSTHOOK: query: explain vectorization expression select stringMap, intMap, doubleMap, stringMap['k2'], intMap[456],
+doubleMap[123.123], stringMap[stringIndex], intMap[intIndex], doubleMap[doubleIndex] from parquet_map_type limit 10
+POSTHOOK: type: QUERY
+PLAN VECTORIZATION:
+  enabled: true
+  enabledConditionsMet: [hive.vectorized.execution.enabled IS true]
+
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 depends on stages: Stage-1
+
+STAGE PLANS:
+  Stage: Stage-1
+    Tez
+#### A masked pattern was here ####
+      Vertices:
+        Map 1 
+            Map Operator Tree:
+                TableScan
+                  alias: parquet_map_type
+                  Statistics: Num rows: 1023 Data size: 2183412 Basic stats: COMPLETE Column stats: NONE
+                  TableScan Vectorization:
+                      native: true
+                  Select Operator
+                    expressions: stringmap (type: map<string,string>), intmap (type: map<int,int>), doublemap (type: map<double,double>), stringmap['k2'] (type: string), intmap[456] (type: int), doublemap[123.123] (type: double), stringmap[stringindex] (type: string), intmap[intindex] (type: int), doublemap[doubleindex] (type: double)
+                    outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8
+                    Select Vectorization:
+                        className: VectorSelectOperator
+                        native: true
+                        projectedOutputColumnNums: [1, 2, 3, 8, 9, 10, 11, 12, 13]
+                        selectExpressions: VectorUDFMapIndexStringScalar(col 1:map<string,string>, key: k2) -> 8:string, VectorUDFMapIndexLongScalar(col 2:map<int,int>, key: 456) -> 9:int, VectorUDFMapIndexDoubleScalar(col 3:map<double,double>, key: 123.123) -> 10:double, VectorUDFMapIndexStringCol(col 1:map<string,string>, key: col 4:string) -> 11:string, VectorUDFMapIndexLongCol(col 2:map<int,int>, key: col 5:int) -> 12:int, VectorUDFMapIndexDoubleCol(col 3:map<double,double>, key: col 6:double) -> 13:double
+                    Statistics: Num rows: 1023 Data size: 2183412 Basic stats: COMPLETE Column stats: NONE
+                    Limit
+                      Number of rows: 10
+                      Limit Vectorization:
+                          className: VectorLimitOperator
+                          native: true
+                      Statistics: Num rows: 10 Data size: 21340 Basic stats: COMPLETE Column stats: NONE
+                      File Output Operator
+                        compressed: false
+                        File Sink Vectorization:
+                            className: VectorFileSinkOperator
+                            native: false
+                        Statistics: Num rows: 10 Data size: 21340 Basic stats: COMPLETE Column stats: NONE
+                        table:
+                            input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+                            output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+                            serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+            Execution mode: vectorized, llap
+            LLAP IO: all inputs (cache only)
+            Map Vectorization:
+                enabled: true
+                enabledConditionsMet: hive.vectorized.use.vectorized.input.format IS true
+                inputFormatFeatureSupport: []
+                featureSupportInUse: []
+                inputFileFormats: org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat
+                allNative: false
+                usesVectorUDFAdaptor: false
+                vectorized: true
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: 10
+      Processor Tree:
+        ListSink
+
+PREHOOK: query: select stringMap, intMap, doubleMap, stringMap['k2'], intMap[456], doubleMap[123.123],
+stringMap[stringIndex], intMap[intIndex], doubleMap[doubleIndex] from parquet_map_type limit 10
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+POSTHOOK: query: select stringMap, intMap, doubleMap, stringMap['k2'], intMap[456], doubleMap[123.123],
+stringMap[stringIndex], intMap[intIndex], doubleMap[doubleIndex] from parquet_map_type limit 10
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+{"k1":"v1","k2":"v1-2"}	{456:2,123:1}	{123.123:1.1,456.456:1.2}	v1-2	2	1.1	v1	1	1.2
+{"k1":"v2","k2":"v2-2"}	{456:4,123:3}	{123.123:2.1,456.456:2.2}	v2-2	4	2.1	v2	3	2.2
+{"k1":"v3","k2":"v3-2"}	{456:6,123:5}	{123.123:3.1,456.456:3.2}	v3-2	6	3.1	v3	5	3.2
+{"k1":"v4","k2":"v4-2"}	{456:8,123:7}	{123.123:4.1,456.456:4.2}	v4-2	8	4.1	v4	7	4.2
+{"k1":"v5","k2":"v5-2"}	{456:10,123:9}	{123.123:5.1,456.456:5.2}	v5-2	10	5.1	v5	9	5.2
+{"k1":"v6","k2":"v6-2"}	{456:12,123:11}	{123.123:6.1,456.456:6.2}	v6-2	12	6.1	v6	11	6.2
+{"k1":"v7","k2":"v7-2"}	{456:14,123:13}	{123.123:7.1,456.456:7.2}	v7-2	14	7.1	v7	13	7.2
+{"k1":"v8","k2":"v8-2"}	{456:16,123:15}	{123.123:8.1,456.456:8.2}	v8-2	16	8.1	v8	15	8.2
+{"k1":"v9","k2":"v9-2"}	{456:18,123:17}	{123.123:9.1,456.456:9.2}	v9-2	18	9.1	v9	17	9.2
+{"k1":"v10","k2":"v10-2"}	{456:20,123:19}	{123.123:10.1,456.456:10.2}	v10-2	20	10.1	v10	19	10.2
+PREHOOK: query: explain vectorization expression select sum(intMap[123]), sum(doubleMap[123.123]), stringMap['k1']
+from parquet_map_type where stringMap['k1'] like 'v100%' group by stringMap['k1'] order by stringMap['k1'] limit 10
+PREHOOK: type: QUERY
+POSTHOOK: query: explain vectorization expression select sum(intMap[123]), sum(doubleMap[123.123]), stringMap['k1']
+from parquet_map_type where stringMap['k1'] like 'v100%' group by stringMap['k1'] order by stringMap['k1'] limit 10
+POSTHOOK: type: QUERY
+PLAN VECTORIZATION:
+  enabled: true
+  enabledConditionsMet: [hive.vectorized.execution.enabled IS true]
+
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 depends on stages: Stage-1
+
+STAGE PLANS:
+  Stage: Stage-1
+    Tez
+#### A masked pattern was here ####
+      Edges:
+        Reducer 2 <- Map 1 (SIMPLE_EDGE)
+        Reducer 3 <- Reducer 2 (SIMPLE_EDGE)
+#### A masked pattern was here ####
+      Vertices:
+        Map 1 
+            Map Operator Tree:
+                TableScan
+                  alias: parquet_map_type
+                  Statistics: Num rows: 1023 Data size: 1992704 Basic stats: COMPLETE Column stats: NONE
+                  TableScan Vectorization:
+                      native: true
+                  Filter Operator
+                    Filter Vectorization:
+                        className: VectorFilterOperator
+                        native: true
+                        predicateExpression: FilterStringColLikeStringScalar(col 8:string, pattern v100%)(children: VectorUDFMapIndexStringScalar(col 1:map<string,string>, key: k1) -> 8:string)
+                    predicate: (stringmap['k1'] like 'v100%') (type: boolean)
+                    Statistics: Num rows: 511 Data size: 995378 Basic stats: COMPLETE Column stats: NONE
+                    Select Operator
+                      expressions: stringmap['k1'] (type: string), intmap[123] (type: int), doublemap[123.123] (type: double)
+                      outputColumnNames: _col0, _col1, _col2
+                      Select Vectorization:
+                          className: VectorSelectOperator
+                          native: true
+                          projectedOutputColumnNums: [8, 9, 10]
+                          selectExpressions: VectorUDFMapIndexStringScalar(col 1:map<string,string>, key: k1) -> 8:string, VectorUDFMapIndexLongScalar(col 2:map<int,int>, key: 123) -> 9:int, VectorUDFMapIndexDoubleScalar(col 3:map<double,double>, key: 123.123) -> 10:double
+                      Statistics: Num rows: 511 Data size: 995378 Basic stats: COMPLETE Column stats: NONE
+                      Group By Operator
+                        aggregations: sum(_col1), sum(_col2)
+                        Group By Vectorization:
+                            aggregators: VectorUDAFSumLong(col 9:int) -> bigint, VectorUDAFSumDouble(col 10:double) -> double
+                            className: VectorGroupByOperator
+                            groupByMode: HASH
+                            keyExpressions: col 8:string
+                            native: false
+                            vectorProcessingMode: HASH
+                            projectedOutputColumnNums: [0, 1]
+                        keys: _col0 (type: string)
+                        mode: hash
+                        outputColumnNames: _col0, _col1, _col2
+                        Statistics: Num rows: 511 Data size: 995378 Basic stats: COMPLETE Column stats: NONE
+                        Reduce Output Operator
+                          key expressions: _col0 (type: string)
+                          sort order: +
+                          Map-reduce partition columns: _col0 (type: string)
+                          Reduce Sink Vectorization:
+                              className: VectorReduceSinkStringOperator
+                              native: true
+                              nativeConditionsMet: hive.vectorized.execution.reducesink.new.enabled IS true, hive.execution.engine tez IN [tez, spark] IS true, No PTF TopN IS true, No DISTINCT columns IS true, BinarySortableSerDe for keys IS true, LazyBinarySerDe for values IS true
+                          Statistics: Num rows: 511 Data size: 995378 Basic stats: COMPLETE Column stats: NONE
+                          TopN Hash Memory Usage: 0.1
+                          value expressions: _col1 (type: bigint), _col2 (type: double)
+            Execution mode: vectorized, llap
+            LLAP IO: all inputs (cache only)
+            Map Vectorization:
+                enabled: true
+                enabledConditionsMet: hive.vectorized.use.vectorized.input.format IS true
+                inputFormatFeatureSupport: []
+                featureSupportInUse: []
+                inputFileFormats: org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat
+                allNative: false
+                usesVectorUDFAdaptor: false
+                vectorized: true
+        Reducer 2 
+            Execution mode: vectorized, llap
+            Reduce Vectorization:
+                enabled: true
+                enableConditionsMet: hive.vectorized.execution.reduce.enabled IS true, hive.execution.engine tez IN [tez, spark] IS true
+                allNative: false
+                usesVectorUDFAdaptor: false
+                vectorized: true
+            Reduce Operator Tree:
+              Group By Operator
+                aggregations: sum(VALUE._col0), sum(VALUE._col1)
+                Group By Vectorization:
+                    aggregators: VectorUDAFSumLong(col 1:bigint) -> bigint, VectorUDAFSumDouble(col 2:double) -> double
+                    className: VectorGroupByOperator
+                    groupByMode: MERGEPARTIAL
+                    keyExpressions: col 0:string
+                    native: false
+                    vectorProcessingMode: MERGE_PARTIAL
+                    projectedOutputColumnNums: [0, 1]
+                keys: KEY._col0 (type: string)
+                mode: mergepartial
+                outputColumnNames: _col0, _col1, _col2
+                Statistics: Num rows: 255 Data size: 496715 Basic stats: COMPLETE Column stats: NONE
+                Select Operator
+                  expressions: _col1 (type: bigint), _col2 (type: double), _col0 (type: string)
+                  outputColumnNames: _col0, _col1, _col3
+                  Select Vectorization:
+                      className: VectorSelectOperator
+                      native: true
+                      projectedOutputColumnNums: [1, 2, 0]
+                  Statistics: Num rows: 255 Data size: 496715 Basic stats: COMPLETE Column stats: NONE
+                  Reduce Output Operator
+                    key expressions: _col3 (type: string)
+                    sort order: +
+                    Reduce Sink Vectorization:
+                        className: VectorReduceSinkObjectHashOperator
+                        native: true
+                        nativeConditionsMet: hive.vectorized.execution.reducesink.new.enabled IS true, hive.execution.engine tez IN [tez, spark] IS true, No PTF TopN IS true, No DISTINCT columns IS true, BinarySortableSerDe for keys IS true, LazyBinarySerDe for values IS true
+                    Statistics: Num rows: 255 Data size: 496715 Basic stats: COMPLETE Column stats: NONE
+                    TopN Hash Memory Usage: 0.1
+                    value expressions: _col0 (type: bigint), _col1 (type: double)
+        Reducer 3 
+            Execution mode: vectorized, llap
+            Reduce Vectorization:
+                enabled: true
+                enableConditionsMet: hive.vectorized.execution.reduce.enabled IS true, hive.execution.engine tez IN [tez, spark] IS true
+                allNative: false
+                usesVectorUDFAdaptor: false
+                vectorized: true
+            Reduce Operator Tree:
+              Select Operator
+                expressions: VALUE._col0 (type: bigint), VALUE._col1 (type: double), KEY.reducesinkkey0 (type: string)
+                outputColumnNames: _col0, _col1, _col2
+                Select Vectorization:
+                    className: VectorSelectOperator
+                    native: true
+                    projectedOutputColumnNums: [1, 2, 0]
+                Statistics: Num rows: 255 Data size: 496715 Basic stats: COMPLETE Column stats: NONE
+                Limit
+                  Number of rows: 10
+                  Limit Vectorization:
+                      className: VectorLimitOperator
+                      native: true
+                  Statistics: Num rows: 10 Data size: 19470 Basic stats: COMPLETE Column stats: NONE
+                  File Output Operator
+                    compressed: false
+                    File Sink Vectorization:
+                        className: VectorFileSinkOperator
+                        native: false
+                    Statistics: Num rows: 10 Data size: 19470 Basic stats: COMPLETE Column stats: NONE
+                    table:
+                        input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+                        output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+                        serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+      Processor Tree:
+        ListSink
+
+PREHOOK: query: select sum(intMap[123]), sum(doubleMap[123.123]), stringMap['k1']
+from parquet_map_type where stringMap['k1'] like 'v100%' group by stringMap['k1'] order by stringMap['k1'] limit 10
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+POSTHOOK: query: select sum(intMap[123]), sum(doubleMap[123.123]), stringMap['k1']
+from parquet_map_type where stringMap['k1'] like 'v100%' group by stringMap['k1'] order by stringMap['k1'] limit 10
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+199	100.1	v100
+1999	1000.1	v1000
+2001	1001.1	v1001
+2003	1002.1	v1002
+2005	1003.1	v1003
+2007	1004.1	v1004
+2009	1005.1	v1005
+2011	1006.1	v1006
+2013	1007.1	v1007
+2015	1008.1	v1008
+PREHOOK: query: INSERT OVERWRITE TABLE parquet_map_type
+SELECT id, stringMap, intMap, doubleMap, stringIndex, intIndex, doubleIndex FROM parquet_map_type_staging where id < 1025
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type_staging
+PREHOOK: Output: default@parquet_map_type
+POSTHOOK: query: INSERT OVERWRITE TABLE parquet_map_type
+SELECT id, stringMap, intMap, doubleMap, stringIndex, intIndex, doubleIndex FROM parquet_map_type_staging where id < 1025
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type_staging
+POSTHOOK: Output: default@parquet_map_type
+POSTHOOK: Lineage: parquet_map_type.doubleindex SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:doubleindex, type:double, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.doublemap SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:doublemap, type:map<double,double>, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.id SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:id, type:int, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.intindex SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:intindex, type:int, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.intmap SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:intmap, type:map<int,int>, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.stringindex SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:stringindex, type:string, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.stringmap SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:stringmap, type:map<string,string>, comment:null), ]
+PREHOOK: query: select count(*) from parquet_map_type
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+POSTHOOK: query: select count(*) from parquet_map_type
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+1024
+PREHOOK: query: select stringMap, intMap, doubleMap, stringMap['k2'], intMap[456], doubleMap[123.123],
+stringMap[stringIndex], intMap[intIndex], doubleMap[doubleIndex] from parquet_map_type limit 10
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+POSTHOOK: query: select stringMap, intMap, doubleMap, stringMap['k2'], intMap[456], doubleMap[123.123],
+stringMap[stringIndex], intMap[intIndex], doubleMap[doubleIndex] from parquet_map_type limit 10
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+{"k1":"v1","k2":"v1-2"}	{456:2,123:1}	{123.123:1.1,456.456:1.2}	v1-2	2	1.1	v1	1	1.2
+{"k1":"v2","k2":"v2-2"}	{456:4,123:3}	{123.123:2.1,456.456:2.2}	v2-2	4	2.1	v2	3	2.2
+{"k1":"v3","k2":"v3-2"}	{456:6,123:5}	{123.123:3.1,456.456:3.2}	v3-2	6	3.1	v3	5	3.2
+{"k1":"v4","k2":"v4-2"}	{456:8,123:7}	{123.123:4.1,456.456:4.2}	v4-2	8	4.1	v4	7	4.2
+{"k1":"v5","k2":"v5-2"}	{456:10,123:9}	{123.123:5.1,456.456:5.2}	v5-2	10	5.1	v5	9	5.2
+{"k1":"v6","k2":"v6-2"}	{456:12,123:11}	{123.123:6.1,456.456:6.2}	v6-2	12	6.1	v6	11	6.2
+{"k1":"v7","k2":"v7-2"}	{456:14,123:13}	{123.123:7.1,456.456:7.2}	v7-2	14	7.1	v7	13	7.2
+{"k1":"v8","k2":"v8-2"}	{456:16,123:15}	{123.123:8.1,456.456:8.2}	v8-2	16	8.1	v8	15	8.2
+{"k1":"v9","k2":"v9-2"}	{456:18,123:17}	{123.123:9.1,456.456:9.2}	v9-2	18	9.1	v9	17	9.2
+{"k1":"v10","k2":"v10-2"}	{456:20,123:19}	{123.123:10.1,456.456:10.2}	v10-2	20	10.1	v10	19	10.2
+PREHOOK: query: select sum(intMap[123]), sum(doubleMap[123.123]), stringMap['k1']
+from parquet_map_type where stringMap['k1'] like 'v100%' group by stringMap['k1'] order by stringMap['k1'] limit 10
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+POSTHOOK: query: select sum(intMap[123]), sum(doubleMap[123.123]), stringMap['k1']
+from parquet_map_type where stringMap['k1'] like 'v100%' group by stringMap['k1'] order by stringMap['k1'] limit 10
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+199	100.1	v100
+1999	1000.1	v1000
+2001	1001.1	v1001
+2003	1002.1	v1002
+2005	1003.1	v1003
+2007	1004.1	v1004
+2009	1005.1	v1005
+2011	1006.1	v1006
+2013	1007.1	v1007
+2015	1008.1	v1008
+PREHOOK: query: INSERT OVERWRITE TABLE parquet_map_type
+SELECT id, stringMap, intMap, doubleMap, stringIndex, intIndex, doubleIndex FROM parquet_map_type_staging
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type_staging
+PREHOOK: Output: default@parquet_map_type
+POSTHOOK: query: INSERT OVERWRITE TABLE parquet_map_type
+SELECT id, stringMap, intMap, doubleMap, stringIndex, intIndex, doubleIndex FROM parquet_map_type_staging
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type_staging
+POSTHOOK: Output: default@parquet_map_type
+POSTHOOK: Lineage: parquet_map_type.doubleindex SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:doubleindex, type:double, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.doublemap SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:doublemap, type:map<double,double>, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.id SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:id, type:int, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.intindex SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:intindex, type:int, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.intmap SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:intmap, type:map<int,int>, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.stringindex SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:stringindex, type:string, comment:null), ]
+POSTHOOK: Lineage: parquet_map_type.stringmap SIMPLE [(parquet_map_type_staging)parquet_map_type_staging.FieldSchema(name:stringmap, type:map<string,string>, comment:null), ]
+PREHOOK: query: select count(*) from parquet_map_type
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+POSTHOOK: query: select count(*) from parquet_map_type
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+1025
+PREHOOK: query: select stringMap, intMap, doubleMap, stringMap['k2'], intMap[456], doubleMap[123.123],
+stringMap[stringIndex], intMap[intIndex], doubleMap[doubleIndex] from parquet_map_type limit 10
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+POSTHOOK: query: select stringMap, intMap, doubleMap, stringMap['k2'], intMap[456], doubleMap[123.123],
+stringMap[stringIndex], intMap[intIndex], doubleMap[doubleIndex] from parquet_map_type limit 10
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+{"k1":"v1","k2":"v1-2"}	{456:2,123:1}	{123.123:1.1,456.456:1.2}	v1-2	2	1.1	v1	1	1.2
+{"k1":"v2","k2":"v2-2"}	{456:4,123:3}	{123.123:2.1,456.456:2.2}	v2-2	4	2.1	v2	3	2.2
+{"k1":"v3","k2":"v3-2"}	{456:6,123:5}	{123.123:3.1,456.456:3.2}	v3-2	6	3.1	v3	5	3.2
+{"k1":"v4","k2":"v4-2"}	{456:8,123:7}	{123.123:4.1,456.456:4.2}	v4-2	8	4.1	v4	7	4.2
+{"k1":"v5","k2":"v5-2"}	{456:10,123:9}	{123.123:5.1,456.456:5.2}	v5-2	10	5.1	v5	9	5.2
+{"k1":"v6","k2":"v6-2"}	{456:12,123:11}	{123.123:6.1,456.456:6.2}	v6-2	12	6.1	v6	11	6.2
+{"k1":"v7","k2":"v7-2"}	{456:14,123:13}	{123.123:7.1,456.456:7.2}	v7-2	14	7.1	v7	13	7.2
+{"k1":"v8","k2":"v8-2"}	{456:16,123:15}	{123.123:8.1,456.456:8.2}	v8-2	16	8.1	v8	15	8.2
+{"k1":"v9","k2":"v9-2"}	{456:18,123:17}	{123.123:9.1,456.456:9.2}	v9-2	18	9.1	v9	17	9.2
+{"k1":"v10","k2":"v10-2"}	{456:20,123:19}	{123.123:10.1,456.456:10.2}	v10-2	20	10.1	v10	19	10.2
+PREHOOK: query: select sum(intMap[123]), sum(doubleMap[123.123]), stringMap['k1']
+from parquet_map_type where stringMap['k1'] like 'v100%' group by stringMap['k1'] order by stringMap['k1'] limit 10
+PREHOOK: type: QUERY
+PREHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+POSTHOOK: query: select sum(intMap[123]), sum(doubleMap[123.123]), stringMap['k1']
+from parquet_map_type where stringMap['k1'] like 'v100%' group by stringMap['k1'] order by stringMap['k1'] limit 10
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@parquet_map_type
+#### A masked pattern was here ####
+199	100.1	v100
+1999	1000.1	v1000
+2001	1001.1	v1001
+2003	1002.1	v1002
+2005	1003.1	v1003
+2007	1004.1	v1004
+2009	1005.1	v1005
+2011	1006.1	v1006
+2013	1007.1	v1007
+2015	1008.1	v1008