You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by gu...@apache.org on 2014/03/07 20:55:18 UTC
svn commit: r1575389 - in /hive/trunk: itests/qtest/
ql/src/java/org/apache/hadoop/hive/ql/parse/
ql/src/test/queries/clientpositive/ ql/src/test/results/clientpositive/tez/
Author: gunther
Date: Fri Mar 7 19:55:17 2014
New Revision: 1575389
URL: http://svn.apache.org/r1575389
Log:
HIVE-6566: Incorrect union-all plan with map-joins on Tez (Gunther Hagleitner, reviewed by Sergey Shelukhin)
Added:
hive/trunk/ql/src/test/queries/clientpositive/tez_union.q
hive/trunk/ql/src/test/results/clientpositive/tez/tez_union.q.out
Modified:
hive/trunk/itests/qtest/pom.xml
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/GenTezUtils.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/GenTezWork.java
Modified: hive/trunk/itests/qtest/pom.xml
URL: http://svn.apache.org/viewvc/hive/trunk/itests/qtest/pom.xml?rev=1575389&r1=1575388&r2=1575389&view=diff
==============================================================================
--- hive/trunk/itests/qtest/pom.xml (original)
+++ hive/trunk/itests/qtest/pom.xml Fri Mar 7 19:55:17 2014
@@ -38,7 +38,7 @@
<execute.beeline.tests>false</execute.beeline.tests>
<minimr.query.files>stats_counter_partitioned.q,list_bucket_dml_10.q,input16_cc.q,scriptfile1.q,scriptfile1_win.q,bucket4.q,bucketmapjoin6.q,disable_merge_for_bucketing.q,reduce_deduplicate.q,smb_mapjoin_8.q,join1.q,groupby2.q,bucketizedhiveinputformat.q,bucketmapjoin7.q,optrstat_groupby.q,bucket_num_reducers.q,bucket5.q,load_fs2.q,bucket_num_reducers2.q,infer_bucket_sort_merge.q,infer_bucket_sort_reducers_power_two.q,infer_bucket_sort_dyn_part.q,infer_bucket_sort_bucketed_table.q,infer_bucket_sort_map_operators.q,infer_bucket_sort_num_buckets.q,leftsemijoin_mr.q,schemeAuthority.q,schemeAuthority2.q,truncate_column_buckets.q,remote_script.q,,load_hdfs_file_with_space_in_the_name.q,parallel_orderby.q,import_exported_table.q,stats_counter.q,auto_sortmerge_join_16.q,quotedid_smb.q,file_with_header_footer.q,external_table_with_space_in_location_path.q,root_dir_external_table.q,index_bitmap3.q,ql_rewrite_gbtoidx.q,index_bitmap_auto.q,udf_using.q</minimr.query.files>
<minimr.query.negative.files>cluster_tasklog_retrieval.q,minimr_broken_pipe.q,mapreduce_stack_trace.q,mapreduce_stack_trace_turnoff.q,mapreduce_stack_trace_hadoop20.q,mapreduce_stack_trace_turnoff_hadoop20.q,file_with_header_footer_negative.q,udf_local_resource.q</minimr.query.negative.files>
- <minitez.query.files>tez_join_tests.q,tez_joins_explain.q,mrr.q,tez_dml.q,tez_insert_overwrite_local_directory_1.q</minitez.query.files>
+ <minitez.query.files>tez_join_tests.q,tez_joins_explain.q,mrr.q,tez_dml.q,tez_insert_overwrite_local_directory_1.q,tez_union.q</minitez.query.files>
<minitez.query.files.shared>join0.q,join1.q,auto_join0.q,auto_join1.q,bucket2.q,bucket3.q,bucket4.q,count.q,create_merge_compressed.q,cross_join.q,ctas.q,custom_input_output_format.q,disable_merge_for_bucketing.q,enforce_order.q,filter_join_breaktask.q,filter_join_breaktask2.q,groupby1.q,groupby2.q,groupby3.q,having.q,insert1.q,insert_into1.q,insert_into2.q,leftsemijoin.q,limit_pushdown.q,load_dyn_part1.q,load_dyn_part2.q,load_dyn_part3.q,mapjoin_mapjoin.q,mapreduce1.q,mapreduce2.q,merge1.q,merge2.q,metadata_only_queries.q,sample1.q,subquery_in.q,subquery_exists.q,vectorization_15.q,ptf.q,stats_counter.q,stats_noscan_1.q,stats_counter_partitioned.q,union2.q,union3.q,union4.q,union5.q,union6.q,union7.q,union8.q,union9.q</minitez.query.files.shared>
<beeline.positive.exclude>add_part_exist.q,alter1.q,alter2.q,alter4.q,alter5.q,alter_rename_partition.q,alter_rename_partition_authorization.q,archive.q,archive_corrupt.q,archive_multi.q,archive_mr_1806.q,archive_multi_mr_1806.q,authorization_1.q,authorization_2.q,authorization_4.q,authorization_5.q,authorization_6.q,authorization_7.q,ba_table1.q,ba_table2.q,ba_table3.q,ba_table_udfs.q,binary_table_bincolserde.q,binary_table_colserde.q,cluster.q,columnarserde_create_shortcut.q,combine2.q,constant_prop.q,create_nested_type.q,create_or_replace_view.q,create_struct_table.q,create_union_table.q,database.q,database_location.q,database_properties.q,ddltime.q,describe_database_json.q,drop_database_removes_partition_dirs.q,escape1.q,escape2.q,exim_00_nonpart_empty.q,exim_01_nonpart.q,exim_02_00_part_empty.q,exim_02_part.q,exim_03_nonpart_over_compat.q,exim_04_all_part.q,exim_04_evolved_parts.q,exim_05_some_part.q,exim_06_one_part.q,exim_07_all_part_over_nonoverlap.q,exim_08_nonpart_rena
me.q,exim_09_part_spec_nonoverlap.q,exim_10_external_managed.q,exim_11_managed_external.q,exim_12_external_location.q,exim_13_managed_location.q,exim_14_managed_location_over_existing.q,exim_15_external_part.q,exim_16_part_external.q,exim_17_part_managed.q,exim_18_part_external.q,exim_19_00_part_external_location.q,exim_19_part_external_location.q,exim_20_part_managed_location.q,exim_21_export_authsuccess.q,exim_22_import_exist_authsuccess.q,exim_23_import_part_authsuccess.q,exim_24_import_nonexist_authsuccess.q,global_limit.q,groupby_complex_types.q,groupby_complex_types_multi_single_reducer.q,index_auth.q,index_auto.q,index_auto_empty.q,index_bitmap.q,index_bitmap1.q,index_bitmap2.q,index_bitmap3.q,index_bitmap_auto.q,index_bitmap_rc.q,index_compact.q,index_compact_1.q,index_compact_2.q,index_compact_3.q,index_stale_partitioned.q,init_file.q,input16.q,input16_cc.q,input46.q,input_columnarserde.q,input_dynamicserde.q,input_lazyserde.q,input_testxpath3.q,input_testxpath4.q,insert2_o
verwrite_partitions.q,insertexternal1.q,join_thrift.q,lateral_view.q,load_binary_data.q,load_exist_part_authsuccess.q,load_nonpart_authsuccess.q,load_part_authsuccess.q,loadpart_err.q,lock1.q,lock2.q,lock3.q,lock4.q,merge_dynamic_partition.q,multi_insert.q,multi_insert_move_tasks_share_dependencies.q,null_column.q,ppd_clusterby.q,query_with_semi.q,rename_column.q,sample6.q,sample_islocalmode_hook.q,set_processor_namespaces.q,show_tables.q,source.q,split_sample.q,str_to_map.q,transform1.q,udaf_collect_set.q,udaf_context_ngrams.q,udaf_histogram_numeric.q,udaf_ngrams.q,udaf_percentile_approx.q,udf_array.q,udf_bitmap_and.q,udf_bitmap_or.q,udf_explode.q,udf_format_number.q,udf_map.q,udf_map_keys.q,udf_map_values.q,udf_max.q,udf_min.q,udf_named_struct.q,udf_percentile.q,udf_printf.q,udf_sentences.q,udf_sort_array.q,udf_split.q,udf_struct.q,udf_substr.q,udf_translate.q,udf_union.q,udf_xpath.q,udtf_stack.q,view.q,virtual_column.q</beeline.positive.exclude>
</properties>
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/GenTezUtils.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/GenTezUtils.java?rev=1575389&r1=1575388&r2=1575389&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/GenTezUtils.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/GenTezUtils.java Fri Mar 7 19:55:17 2014
@@ -35,6 +35,7 @@ import org.apache.hadoop.conf.Configurat
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.ql.exec.Operator;
import org.apache.hadoop.hive.ql.exec.FileSinkOperator;
+import org.apache.hadoop.hive.ql.exec.HashTableDummyOperator;
import org.apache.hadoop.hive.ql.exec.ReduceSinkOperator;
import org.apache.hadoop.hive.ql.exec.TableScanOperator;
import org.apache.hadoop.hive.ql.exec.UnionOperator;
@@ -160,15 +161,32 @@ public class GenTezUtils {
throws SemanticException {
Set<Operator<?>> roots = work.getAllRootOperators();
+ if (work.getDummyOps() != null) {
+ roots.addAll(work.getDummyOps());
+ }
// need to clone the plan.
Set<Operator<?>> newRoots = Utilities.cloneOperatorTree(conf, roots);
+ // we're cloning the operator plan but we're retaining the original work. That means
+ // that root operators have to be replaced with the cloned ops. The replacement map
+ // tells you what that mapping is.
Map<Operator<?>, Operator<?>> replacementMap = new HashMap<Operator<?>, Operator<?>>();
+ // there's some special handling for dummyOps required. Mapjoins won't be properly
+ // initialized if their dummy parents aren't initialized. Since we cloned the plan
+ // we need to replace the dummy operators in the work with the cloned ones.
+ List<HashTableDummyOperator> dummyOps = new LinkedList<HashTableDummyOperator>();
+
Iterator<Operator<?>> it = newRoots.iterator();
for (Operator<?> orig: roots) {
- replacementMap.put(orig,it.next());
+ Operator<?> newRoot = it.next();
+ if (newRoot instanceof HashTableDummyOperator) {
+ dummyOps.add((HashTableDummyOperator)newRoot);
+ it.remove();
+ } else {
+ replacementMap.put(orig,newRoot);
+ }
}
// now we remove all the unions. we throw away any branch that's not reachable from
@@ -233,6 +251,7 @@ public class GenTezUtils {
operators.addAll(current.getChildOperators());
}
}
+ work.setDummyOps(dummyOps);
work.replaceRoots(replacementMap);
}
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/GenTezWork.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/GenTezWork.java?rev=1575389&r1=1575388&r2=1575389&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/GenTezWork.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/GenTezWork.java Fri Mar 7 19:55:17 2014
@@ -112,6 +112,42 @@ public class GenTezWork implements NodeP
}
context.rootToWorkMap.put(root, work);
}
+ context.operatorWorkMap.put(operator, work);
+
+ /*
+ * this happens in case of map join operations.
+ * The tree looks like this:
+ *
+ * RS <--- we are here perhaps
+ * |
+ * MapJoin
+ * / \
+ * RS TS
+ * /
+ * TS
+ *
+ * If we are at the RS pointed above, and we may have already visited the
+ * RS following the TS, we have already generated work for the TS-RS.
+ * We need to hook the current work to this generated work.
+ */
+ List<BaseWork> linkWorkList = context.linkOpWithWorkMap.get(operator);
+ if (linkWorkList != null) {
+ if (context.linkChildOpWithDummyOp.containsKey(operator)) {
+ for (Operator<?> dummy: context.linkChildOpWithDummyOp.get(operator)) {
+ work.addDummyOp((HashTableDummyOperator) dummy);
+ }
+ }
+ for (BaseWork parentWork : linkWorkList) {
+ tezWork.connect(parentWork, work, EdgeType.BROADCAST_EDGE);
+
+ // need to set up output name for reduce sink now that we know the name
+ // of the downstream work
+ for (ReduceSinkOperator r:
+ context.linkWorkWithReduceSinkMap.get(parentWork)) {
+ r.getConf().setOutputName(work.getName());
+ }
+ }
+ }
// This is where we cut the tree as described above. We also remember that
// we might have to connect parent work with this work later.
@@ -191,42 +227,6 @@ public class GenTezWork implements NodeP
context.preceedingWork = work;
}
- /*
- * this happens in case of map join operations.
- * The tree looks like this:
- *
- * RS <--- we are here perhaps
- * |
- * MapJoin
- * / \
- * RS TS
- * /
- * TS
- *
- * If we are at the RS pointed above, and we may have already visited the
- * RS following the TS, we have already generated work for the TS-RS.
- * We need to hook the current work to this generated work.
- */
- context.operatorWorkMap.put(operator, work);
- List<BaseWork> linkWorkList = context.linkOpWithWorkMap.get(operator);
- if (linkWorkList != null) {
- if (context.linkChildOpWithDummyOp.containsKey(operator)) {
- for (Operator<?> dummy: context.linkChildOpWithDummyOp.get(operator)) {
- work.addDummyOp((HashTableDummyOperator) dummy);
- }
- }
- for (BaseWork parentWork : linkWorkList) {
- tezWork.connect(parentWork, work, EdgeType.BROADCAST_EDGE);
-
- // need to set up output name for reduce sink now that we know the name
- // of the downstream work
- for (ReduceSinkOperator r:
- context.linkWorkWithReduceSinkMap.get(parentWork)) {
- r.getConf().setOutputName(work.getName());
- }
- }
- }
-
return null;
}
}
Added: hive/trunk/ql/src/test/queries/clientpositive/tez_union.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/tez_union.q?rev=1575389&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/tez_union.q (added)
+++ hive/trunk/ql/src/test/queries/clientpositive/tez_union.q Fri Mar 7 19:55:17 2014
@@ -0,0 +1,10 @@
+set hive.auto.convert.join=true;
+
+explain
+select s1.key as key, s1.value as value from src s1 join src s3 on s1.key=s3.key
+UNION ALL
+select s2.key as key, s2.value as value from src s2;
+
+select s1.key as key, s1.value as value from src s1 join src s3 on s1.key=s3.key
+UNION ALL
+select s2.key as key, s2.value as value from src s2;
\ No newline at end of file
Added: hive/trunk/ql/src/test/results/clientpositive/tez/tez_union.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/tez/tez_union.q.out?rev=1575389&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/tez/tez_union.q.out (added)
+++ hive/trunk/ql/src/test/results/clientpositive/tez/tez_union.q.out Fri Mar 7 19:55:17 2014
@@ -0,0 +1,1621 @@
+PREHOOK: query: explain
+select s1.key as key, s1.value as value from src s1 join src s3 on s1.key=s3.key
+UNION ALL
+select s2.key as key, s2.value as value from src s2
+PREHOOK: type: QUERY
+POSTHOOK: query: explain
+select s1.key as key, s1.value as value from src s1 join src s3 on s1.key=s3.key
+UNION ALL
+select s2.key as key, s2.value as value from src s2
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+ Stage-1 is a root stage
+ Stage-0 is a root stage
+
+STAGE PLANS:
+ Stage: Stage-1
+ Tez
+ Edges:
+ Map 1 <- Union 2 (CONTAINS), Map 3 (BROADCAST_EDGE)
+ Map 4 <- Union 2 (CONTAINS)
+#### A masked pattern was here ####
+ Vertices:
+ Map 1
+ Map Operator Tree:
+ TableScan
+ alias: s1
+ Map Join Operator
+ condition map:
+ Inner Join 0 to 1
+ condition expressions:
+ 0 {key} {value}
+ 1
+ keys:
+ 0 key (type: string)
+ 1 key (type: string)
+ outputColumnNames: _col0, _col1
+ Select Operator
+ expressions: _col0 (type: string), _col1 (type: string)
+ outputColumnNames: _col0, _col1
+ Select Operator
+ expressions: _col0 (type: string), _col1 (type: string)
+ outputColumnNames: _col0, _col1
+ File Output Operator
+ compressed: false
+ table:
+ input format: org.apache.hadoop.mapred.TextInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+ serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+ Map 3
+ Map Operator Tree:
+ TableScan
+ alias: s3
+ Statistics: Num rows: 58 Data size: 5812 Basic stats: COMPLETE Column stats: NONE
+ Reduce Output Operator
+ key expressions: key (type: string)
+ sort order: +
+ Map-reduce partition columns: key (type: string)
+ Statistics: Num rows: 58 Data size: 5812 Basic stats: COMPLETE Column stats: NONE
+ Map 4
+ Map Operator Tree:
+ TableScan
+ alias: s2
+ Select Operator
+ expressions: key (type: string), value (type: string)
+ outputColumnNames: _col0, _col1
+ Select Operator
+ expressions: _col0 (type: string), _col1 (type: string)
+ outputColumnNames: _col0, _col1
+ File Output Operator
+ compressed: false
+ table:
+ input format: org.apache.hadoop.mapred.TextInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+ serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+ Union 2
+ Vertex: Union 2
+
+ Stage: Stage-0
+ Fetch Operator
+ limit: -1
+
+PREHOOK: query: select s1.key as key, s1.value as value from src s1 join src s3 on s1.key=s3.key
+UNION ALL
+select s2.key as key, s2.value as value from src s2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: select s1.key as key, s1.value as value from src s1 join src s3 on s1.key=s3.key
+UNION ALL
+select s2.key as key, s2.value as value from src s2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+238 val_238
+86 val_86
+311 val_311
+27 val_27
+165 val_165
+409 val_409
+255 val_255
+278 val_278
+98 val_98
+484 val_484
+265 val_265
+193 val_193
+401 val_401
+150 val_150
+273 val_273
+224 val_224
+369 val_369
+66 val_66
+128 val_128
+213 val_213
+146 val_146
+406 val_406
+429 val_429
+374 val_374
+152 val_152
+469 val_469
+145 val_145
+495 val_495
+37 val_37
+327 val_327
+281 val_281
+277 val_277
+209 val_209
+15 val_15
+82 val_82
+403 val_403
+166 val_166
+417 val_417
+430 val_430
+252 val_252
+292 val_292
+219 val_219
+287 val_287
+153 val_153
+193 val_193
+338 val_338
+446 val_446
+459 val_459
+394 val_394
+237 val_237
+482 val_482
+174 val_174
+413 val_413
+494 val_494
+207 val_207
+199 val_199
+466 val_466
+208 val_208
+174 val_174
+399 val_399
+396 val_396
+247 val_247
+417 val_417
+489 val_489
+162 val_162
+377 val_377
+397 val_397
+309 val_309
+365 val_365
+266 val_266
+439 val_439
+342 val_342
+367 val_367
+325 val_325
+167 val_167
+195 val_195
+475 val_475
+17 val_17
+113 val_113
+155 val_155
+203 val_203
+339 val_339
+0 val_0
+455 val_455
+128 val_128
+311 val_311
+316 val_316
+57 val_57
+302 val_302
+205 val_205
+149 val_149
+438 val_438
+345 val_345
+129 val_129
+170 val_170
+20 val_20
+489 val_489
+157 val_157
+378 val_378
+221 val_221
+92 val_92
+111 val_111
+47 val_47
+72 val_72
+4 val_4
+280 val_280
+35 val_35
+427 val_427
+277 val_277
+208 val_208
+356 val_356
+399 val_399
+169 val_169
+382 val_382
+498 val_498
+125 val_125
+386 val_386
+437 val_437
+469 val_469
+192 val_192
+286 val_286
+187 val_187
+176 val_176
+54 val_54
+459 val_459
+51 val_51
+138 val_138
+103 val_103
+239 val_239
+213 val_213
+216 val_216
+430 val_430
+278 val_278
+176 val_176
+289 val_289
+221 val_221
+65 val_65
+318 val_318
+332 val_332
+311 val_311
+275 val_275
+137 val_137
+241 val_241
+83 val_83
+333 val_333
+180 val_180
+284 val_284
+12 val_12
+230 val_230
+181 val_181
+67 val_67
+260 val_260
+404 val_404
+384 val_384
+489 val_489
+353 val_353
+373 val_373
+272 val_272
+138 val_138
+217 val_217
+84 val_84
+348 val_348
+466 val_466
+58 val_58
+8 val_8
+411 val_411
+230 val_230
+208 val_208
+348 val_348
+24 val_24
+463 val_463
+431 val_431
+179 val_179
+172 val_172
+42 val_42
+129 val_129
+158 val_158
+119 val_119
+496 val_496
+0 val_0
+322 val_322
+197 val_197
+468 val_468
+393 val_393
+454 val_454
+100 val_100
+298 val_298
+199 val_199
+191 val_191
+418 val_418
+96 val_96
+26 val_26
+165 val_165
+327 val_327
+230 val_230
+205 val_205
+120 val_120
+131 val_131
+51 val_51
+404 val_404
+43 val_43
+436 val_436
+156 val_156
+469 val_469
+468 val_468
+308 val_308
+95 val_95
+196 val_196
+288 val_288
+481 val_481
+457 val_457
+98 val_98
+282 val_282
+197 val_197
+187 val_187
+318 val_318
+318 val_318
+409 val_409
+470 val_470
+137 val_137
+369 val_369
+316 val_316
+169 val_169
+413 val_413
+85 val_85
+77 val_77
+0 val_0
+490 val_490
+87 val_87
+364 val_364
+179 val_179
+118 val_118
+134 val_134
+395 val_395
+282 val_282
+138 val_138
+238 val_238
+419 val_419
+15 val_15
+118 val_118
+72 val_72
+90 val_90
+307 val_307
+19 val_19
+435 val_435
+10 val_10
+277 val_277
+273 val_273
+306 val_306
+224 val_224
+309 val_309
+389 val_389
+327 val_327
+242 val_242
+369 val_369
+392 val_392
+272 val_272
+331 val_331
+401 val_401
+242 val_242
+452 val_452
+177 val_177
+226 val_226
+5 val_5
+497 val_497
+402 val_402
+396 val_396
+317 val_317
+395 val_395
+58 val_58
+35 val_35
+336 val_336
+95 val_95
+11 val_11
+168 val_168
+34 val_34
+229 val_229
+233 val_233
+143 val_143
+472 val_472
+322 val_322
+498 val_498
+160 val_160
+195 val_195
+42 val_42
+321 val_321
+430 val_430
+119 val_119
+489 val_489
+458 val_458
+78 val_78
+76 val_76
+41 val_41
+223 val_223
+492 val_492
+149 val_149
+449 val_449
+218 val_218
+228 val_228
+138 val_138
+453 val_453
+30 val_30
+209 val_209
+64 val_64
+468 val_468
+76 val_76
+74 val_74
+342 val_342
+69 val_69
+230 val_230
+33 val_33
+368 val_368
+103 val_103
+296 val_296
+113 val_113
+216 val_216
+367 val_367
+344 val_344
+167 val_167
+274 val_274
+219 val_219
+239 val_239
+485 val_485
+116 val_116
+223 val_223
+256 val_256
+263 val_263
+70 val_70
+487 val_487
+480 val_480
+401 val_401
+288 val_288
+191 val_191
+5 val_5
+244 val_244
+438 val_438
+128 val_128
+467 val_467
+432 val_432
+202 val_202
+316 val_316
+229 val_229
+469 val_469
+463 val_463
+280 val_280
+2 val_2
+35 val_35
+283 val_283
+331 val_331
+235 val_235
+80 val_80
+44 val_44
+193 val_193
+321 val_321
+335 val_335
+104 val_104
+466 val_466
+366 val_366
+175 val_175
+403 val_403
+483 val_483
+53 val_53
+105 val_105
+257 val_257
+406 val_406
+409 val_409
+190 val_190
+406 val_406
+401 val_401
+114 val_114
+258 val_258
+90 val_90
+203 val_203
+262 val_262
+348 val_348
+424 val_424
+12 val_12
+396 val_396
+201 val_201
+217 val_217
+164 val_164
+431 val_431
+454 val_454
+478 val_478
+298 val_298
+125 val_125
+431 val_431
+164 val_164
+424 val_424
+187 val_187
+382 val_382
+5 val_5
+70 val_70
+397 val_397
+480 val_480
+291 val_291
+24 val_24
+351 val_351
+255 val_255
+104 val_104
+70 val_70
+163 val_163
+438 val_438
+119 val_119
+414 val_414
+200 val_200
+491 val_491
+237 val_237
+439 val_439
+360 val_360
+248 val_248
+479 val_479
+305 val_305
+417 val_417
+199 val_199
+444 val_444
+120 val_120
+429 val_429
+169 val_169
+443 val_443
+323 val_323
+325 val_325
+277 val_277
+230 val_230
+478 val_478
+178 val_178
+468 val_468
+310 val_310
+317 val_317
+333 val_333
+493 val_493
+460 val_460
+207 val_207
+249 val_249
+265 val_265
+480 val_480
+83 val_83
+136 val_136
+353 val_353
+172 val_172
+214 val_214
+462 val_462
+233 val_233
+406 val_406
+133 val_133
+175 val_175
+189 val_189
+454 val_454
+375 val_375
+401 val_401
+421 val_421
+407 val_407
+384 val_384
+256 val_256
+26 val_26
+134 val_134
+67 val_67
+384 val_384
+379 val_379
+18 val_18
+462 val_462
+492 val_492
+100 val_100
+298 val_298
+9 val_9
+341 val_341
+498 val_498
+146 val_146
+458 val_458
+362 val_362
+186 val_186
+285 val_285
+348 val_348
+167 val_167
+18 val_18
+273 val_273
+183 val_183
+281 val_281
+344 val_344
+97 val_97
+469 val_469
+315 val_315
+84 val_84
+28 val_28
+37 val_37
+448 val_448
+152 val_152
+348 val_348
+307 val_307
+194 val_194
+414 val_414
+477 val_477
+222 val_222
+126 val_126
+90 val_90
+169 val_169
+403 val_403
+400 val_400
+200 val_200
+97 val_97
+238 val_238
+238 val_238
+86 val_86
+311 val_311
+311 val_311
+311 val_311
+27 val_27
+165 val_165
+165 val_165
+409 val_409
+409 val_409
+409 val_409
+255 val_255
+255 val_255
+278 val_278
+278 val_278
+98 val_98
+98 val_98
+484 val_484
+265 val_265
+265 val_265
+193 val_193
+193 val_193
+193 val_193
+401 val_401
+401 val_401
+401 val_401
+401 val_401
+401 val_401
+150 val_150
+273 val_273
+273 val_273
+273 val_273
+224 val_224
+224 val_224
+369 val_369
+369 val_369
+369 val_369
+66 val_66
+128 val_128
+128 val_128
+128 val_128
+213 val_213
+213 val_213
+146 val_146
+146 val_146
+406 val_406
+406 val_406
+406 val_406
+406 val_406
+429 val_429
+429 val_429
+374 val_374
+152 val_152
+152 val_152
+469 val_469
+469 val_469
+469 val_469
+469 val_469
+469 val_469
+145 val_145
+495 val_495
+37 val_37
+37 val_37
+327 val_327
+327 val_327
+327 val_327
+281 val_281
+281 val_281
+277 val_277
+277 val_277
+277 val_277
+277 val_277
+209 val_209
+209 val_209
+15 val_15
+15 val_15
+82 val_82
+403 val_403
+403 val_403
+403 val_403
+166 val_166
+417 val_417
+417 val_417
+417 val_417
+430 val_430
+430 val_430
+430 val_430
+252 val_252
+292 val_292
+219 val_219
+219 val_219
+287 val_287
+153 val_153
+193 val_193
+193 val_193
+193 val_193
+338 val_338
+446 val_446
+459 val_459
+459 val_459
+394 val_394
+237 val_237
+237 val_237
+482 val_482
+174 val_174
+174 val_174
+413 val_413
+413 val_413
+494 val_494
+207 val_207
+207 val_207
+199 val_199
+199 val_199
+199 val_199
+466 val_466
+466 val_466
+466 val_466
+208 val_208
+208 val_208
+208 val_208
+174 val_174
+174 val_174
+399 val_399
+399 val_399
+396 val_396
+396 val_396
+396 val_396
+247 val_247
+417 val_417
+417 val_417
+417 val_417
+489 val_489
+489 val_489
+489 val_489
+489 val_489
+162 val_162
+377 val_377
+397 val_397
+397 val_397
+309 val_309
+309 val_309
+365 val_365
+266 val_266
+439 val_439
+439 val_439
+342 val_342
+342 val_342
+367 val_367
+367 val_367
+325 val_325
+325 val_325
+167 val_167
+167 val_167
+167 val_167
+195 val_195
+195 val_195
+475 val_475
+17 val_17
+113 val_113
+113 val_113
+155 val_155
+203 val_203
+203 val_203
+339 val_339
+0 val_0
+0 val_0
+0 val_0
+455 val_455
+128 val_128
+128 val_128
+128 val_128
+311 val_311
+311 val_311
+311 val_311
+316 val_316
+316 val_316
+316 val_316
+57 val_57
+302 val_302
+205 val_205
+205 val_205
+149 val_149
+149 val_149
+438 val_438
+438 val_438
+438 val_438
+345 val_345
+129 val_129
+129 val_129
+170 val_170
+20 val_20
+489 val_489
+489 val_489
+489 val_489
+489 val_489
+157 val_157
+378 val_378
+221 val_221
+221 val_221
+92 val_92
+111 val_111
+47 val_47
+72 val_72
+72 val_72
+4 val_4
+280 val_280
+280 val_280
+35 val_35
+35 val_35
+35 val_35
+427 val_427
+277 val_277
+277 val_277
+277 val_277
+277 val_277
+208 val_208
+208 val_208
+208 val_208
+356 val_356
+399 val_399
+399 val_399
+169 val_169
+169 val_169
+169 val_169
+169 val_169
+382 val_382
+382 val_382
+498 val_498
+498 val_498
+498 val_498
+125 val_125
+125 val_125
+386 val_386
+437 val_437
+469 val_469
+469 val_469
+469 val_469
+469 val_469
+469 val_469
+192 val_192
+286 val_286
+187 val_187
+187 val_187
+187 val_187
+176 val_176
+176 val_176
+54 val_54
+459 val_459
+459 val_459
+51 val_51
+51 val_51
+138 val_138
+138 val_138
+138 val_138
+138 val_138
+103 val_103
+103 val_103
+239 val_239
+239 val_239
+213 val_213
+213 val_213
+216 val_216
+216 val_216
+430 val_430
+430 val_430
+430 val_430
+278 val_278
+278 val_278
+176 val_176
+176 val_176
+289 val_289
+221 val_221
+221 val_221
+65 val_65
+318 val_318
+318 val_318
+318 val_318
+332 val_332
+311 val_311
+311 val_311
+311 val_311
+275 val_275
+137 val_137
+137 val_137
+241 val_241
+83 val_83
+83 val_83
+333 val_333
+333 val_333
+180 val_180
+284 val_284
+12 val_12
+12 val_12
+230 val_230
+230 val_230
+230 val_230
+230 val_230
+230 val_230
+181 val_181
+67 val_67
+67 val_67
+260 val_260
+404 val_404
+404 val_404
+384 val_384
+384 val_384
+384 val_384
+489 val_489
+489 val_489
+489 val_489
+489 val_489
+353 val_353
+353 val_353
+373 val_373
+272 val_272
+272 val_272
+138 val_138
+138 val_138
+138 val_138
+138 val_138
+217 val_217
+217 val_217
+84 val_84
+84 val_84
+348 val_348
+348 val_348
+348 val_348
+348 val_348
+348 val_348
+466 val_466
+466 val_466
+466 val_466
+58 val_58
+58 val_58
+8 val_8
+411 val_411
+230 val_230
+230 val_230
+230 val_230
+230 val_230
+230 val_230
+208 val_208
+208 val_208
+208 val_208
+348 val_348
+348 val_348
+348 val_348
+348 val_348
+348 val_348
+24 val_24
+24 val_24
+463 val_463
+463 val_463
+431 val_431
+431 val_431
+431 val_431
+179 val_179
+179 val_179
+172 val_172
+172 val_172
+42 val_42
+42 val_42
+129 val_129
+129 val_129
+158 val_158
+119 val_119
+119 val_119
+119 val_119
+496 val_496
+0 val_0
+0 val_0
+0 val_0
+322 val_322
+322 val_322
+197 val_197
+197 val_197
+468 val_468
+468 val_468
+468 val_468
+468 val_468
+393 val_393
+454 val_454
+454 val_454
+454 val_454
+100 val_100
+100 val_100
+298 val_298
+298 val_298
+298 val_298
+199 val_199
+199 val_199
+199 val_199
+191 val_191
+191 val_191
+418 val_418
+96 val_96
+26 val_26
+26 val_26
+165 val_165
+165 val_165
+327 val_327
+327 val_327
+327 val_327
+230 val_230
+230 val_230
+230 val_230
+230 val_230
+230 val_230
+205 val_205
+205 val_205
+120 val_120
+120 val_120
+131 val_131
+51 val_51
+51 val_51
+404 val_404
+404 val_404
+43 val_43
+436 val_436
+156 val_156
+469 val_469
+469 val_469
+469 val_469
+469 val_469
+469 val_469
+468 val_468
+468 val_468
+468 val_468
+468 val_468
+308 val_308
+95 val_95
+95 val_95
+196 val_196
+288 val_288
+288 val_288
+481 val_481
+457 val_457
+98 val_98
+98 val_98
+282 val_282
+282 val_282
+197 val_197
+197 val_197
+187 val_187
+187 val_187
+187 val_187
+318 val_318
+318 val_318
+318 val_318
+318 val_318
+318 val_318
+318 val_318
+409 val_409
+409 val_409
+409 val_409
+470 val_470
+137 val_137
+137 val_137
+369 val_369
+369 val_369
+369 val_369
+316 val_316
+316 val_316
+316 val_316
+169 val_169
+169 val_169
+169 val_169
+169 val_169
+413 val_413
+413 val_413
+85 val_85
+77 val_77
+0 val_0
+0 val_0
+0 val_0
+490 val_490
+87 val_87
+364 val_364
+179 val_179
+179 val_179
+118 val_118
+118 val_118
+134 val_134
+134 val_134
+395 val_395
+395 val_395
+282 val_282
+282 val_282
+138 val_138
+138 val_138
+138 val_138
+138 val_138
+238 val_238
+238 val_238
+419 val_419
+15 val_15
+15 val_15
+118 val_118
+118 val_118
+72 val_72
+72 val_72
+90 val_90
+90 val_90
+90 val_90
+307 val_307
+307 val_307
+19 val_19
+435 val_435
+10 val_10
+277 val_277
+277 val_277
+277 val_277
+277 val_277
+273 val_273
+273 val_273
+273 val_273
+306 val_306
+224 val_224
+224 val_224
+309 val_309
+309 val_309
+389 val_389
+327 val_327
+327 val_327
+327 val_327
+242 val_242
+242 val_242
+369 val_369
+369 val_369
+369 val_369
+392 val_392
+272 val_272
+272 val_272
+331 val_331
+331 val_331
+401 val_401
+401 val_401
+401 val_401
+401 val_401
+401 val_401
+242 val_242
+242 val_242
+452 val_452
+177 val_177
+226 val_226
+5 val_5
+5 val_5
+5 val_5
+497 val_497
+402 val_402
+396 val_396
+396 val_396
+396 val_396
+317 val_317
+317 val_317
+395 val_395
+395 val_395
+58 val_58
+58 val_58
+35 val_35
+35 val_35
+35 val_35
+336 val_336
+95 val_95
+95 val_95
+11 val_11
+168 val_168
+34 val_34
+229 val_229
+229 val_229
+233 val_233
+233 val_233
+143 val_143
+472 val_472
+322 val_322
+322 val_322
+498 val_498
+498 val_498
+498 val_498
+160 val_160
+195 val_195
+195 val_195
+42 val_42
+42 val_42
+321 val_321
+321 val_321
+430 val_430
+430 val_430
+430 val_430
+119 val_119
+119 val_119
+119 val_119
+489 val_489
+489 val_489
+489 val_489
+489 val_489
+458 val_458
+458 val_458
+78 val_78
+76 val_76
+76 val_76
+41 val_41
+223 val_223
+223 val_223
+492 val_492
+492 val_492
+149 val_149
+149 val_149
+449 val_449
+218 val_218
+228 val_228
+138 val_138
+138 val_138
+138 val_138
+138 val_138
+453 val_453
+30 val_30
+209 val_209
+209 val_209
+64 val_64
+468 val_468
+468 val_468
+468 val_468
+468 val_468
+76 val_76
+76 val_76
+74 val_74
+342 val_342
+342 val_342
+69 val_69
+230 val_230
+230 val_230
+230 val_230
+230 val_230
+230 val_230
+33 val_33
+368 val_368
+103 val_103
+103 val_103
+296 val_296
+113 val_113
+113 val_113
+216 val_216
+216 val_216
+367 val_367
+367 val_367
+344 val_344
+344 val_344
+167 val_167
+167 val_167
+167 val_167
+274 val_274
+219 val_219
+219 val_219
+239 val_239
+239 val_239
+485 val_485
+116 val_116
+223 val_223
+223 val_223
+256 val_256
+256 val_256
+263 val_263
+70 val_70
+70 val_70
+70 val_70
+487 val_487
+480 val_480
+480 val_480
+480 val_480
+401 val_401
+401 val_401
+401 val_401
+401 val_401
+401 val_401
+288 val_288
+288 val_288
+191 val_191
+191 val_191
+5 val_5
+5 val_5
+5 val_5
+244 val_244
+438 val_438
+438 val_438
+438 val_438
+128 val_128
+128 val_128
+128 val_128
+467 val_467
+432 val_432
+202 val_202
+316 val_316
+316 val_316
+316 val_316
+229 val_229
+229 val_229
+469 val_469
+469 val_469
+469 val_469
+469 val_469
+469 val_469
+463 val_463
+463 val_463
+280 val_280
+280 val_280
+2 val_2
+35 val_35
+35 val_35
+35 val_35
+283 val_283
+331 val_331
+331 val_331
+235 val_235
+80 val_80
+44 val_44
+193 val_193
+193 val_193
+193 val_193
+321 val_321
+321 val_321
+335 val_335
+104 val_104
+104 val_104
+466 val_466
+466 val_466
+466 val_466
+366 val_366
+175 val_175
+175 val_175
+403 val_403
+403 val_403
+403 val_403
+483 val_483
+53 val_53
+105 val_105
+257 val_257
+406 val_406
+406 val_406
+406 val_406
+406 val_406
+409 val_409
+409 val_409
+409 val_409
+190 val_190
+406 val_406
+406 val_406
+406 val_406
+406 val_406
+401 val_401
+401 val_401
+401 val_401
+401 val_401
+401 val_401
+114 val_114
+258 val_258
+90 val_90
+90 val_90
+90 val_90
+203 val_203
+203 val_203
+262 val_262
+348 val_348
+348 val_348
+348 val_348
+348 val_348
+348 val_348
+424 val_424
+424 val_424
+12 val_12
+12 val_12
+396 val_396
+396 val_396
+396 val_396
+201 val_201
+217 val_217
+217 val_217
+164 val_164
+164 val_164
+431 val_431
+431 val_431
+431 val_431
+454 val_454
+454 val_454
+454 val_454
+478 val_478
+478 val_478
+298 val_298
+298 val_298
+298 val_298
+125 val_125
+125 val_125
+431 val_431
+431 val_431
+431 val_431
+164 val_164
+164 val_164
+424 val_424
+424 val_424
+187 val_187
+187 val_187
+187 val_187
+382 val_382
+382 val_382
+5 val_5
+5 val_5
+5 val_5
+70 val_70
+70 val_70
+70 val_70
+397 val_397
+397 val_397
+480 val_480
+480 val_480
+480 val_480
+291 val_291
+24 val_24
+24 val_24
+351 val_351
+255 val_255
+255 val_255
+104 val_104
+104 val_104
+70 val_70
+70 val_70
+70 val_70
+163 val_163
+438 val_438
+438 val_438
+438 val_438
+119 val_119
+119 val_119
+119 val_119
+414 val_414
+414 val_414
+200 val_200
+200 val_200
+491 val_491
+237 val_237
+237 val_237
+439 val_439
+439 val_439
+360 val_360
+248 val_248
+479 val_479
+305 val_305
+417 val_417
+417 val_417
+417 val_417
+199 val_199
+199 val_199
+199 val_199
+444 val_444
+120 val_120
+120 val_120
+429 val_429
+429 val_429
+169 val_169
+169 val_169
+169 val_169
+169 val_169
+443 val_443
+323 val_323
+325 val_325
+325 val_325
+277 val_277
+277 val_277
+277 val_277
+277 val_277
+230 val_230
+230 val_230
+230 val_230
+230 val_230
+230 val_230
+478 val_478
+478 val_478
+178 val_178
+468 val_468
+468 val_468
+468 val_468
+468 val_468
+310 val_310
+317 val_317
+317 val_317
+333 val_333
+333 val_333
+493 val_493
+460 val_460
+207 val_207
+207 val_207
+249 val_249
+265 val_265
+265 val_265
+480 val_480
+480 val_480
+480 val_480
+83 val_83
+83 val_83
+136 val_136
+353 val_353
+353 val_353
+172 val_172
+172 val_172
+214 val_214
+462 val_462
+462 val_462
+233 val_233
+233 val_233
+406 val_406
+406 val_406
+406 val_406
+406 val_406
+133 val_133
+175 val_175
+175 val_175
+189 val_189
+454 val_454
+454 val_454
+454 val_454
+375 val_375
+401 val_401
+401 val_401
+401 val_401
+401 val_401
+401 val_401
+421 val_421
+407 val_407
+384 val_384
+384 val_384
+384 val_384
+256 val_256
+256 val_256
+26 val_26
+26 val_26
+134 val_134
+134 val_134
+67 val_67
+67 val_67
+384 val_384
+384 val_384
+384 val_384
+379 val_379
+18 val_18
+18 val_18
+462 val_462
+462 val_462
+492 val_492
+492 val_492
+100 val_100
+100 val_100
+298 val_298
+298 val_298
+298 val_298
+9 val_9
+341 val_341
+498 val_498
+498 val_498
+498 val_498
+146 val_146
+146 val_146
+458 val_458
+458 val_458
+362 val_362
+186 val_186
+285 val_285
+348 val_348
+348 val_348
+348 val_348
+348 val_348
+348 val_348
+167 val_167
+167 val_167
+167 val_167
+18 val_18
+18 val_18
+273 val_273
+273 val_273
+273 val_273
+183 val_183
+281 val_281
+281 val_281
+344 val_344
+344 val_344
+97 val_97
+97 val_97
+469 val_469
+469 val_469
+469 val_469
+469 val_469
+469 val_469
+315 val_315
+84 val_84
+84 val_84
+28 val_28
+37 val_37
+37 val_37
+448 val_448
+152 val_152
+152 val_152
+348 val_348
+348 val_348
+348 val_348
+348 val_348
+348 val_348
+307 val_307
+307 val_307
+194 val_194
+414 val_414
+414 val_414
+477 val_477
+222 val_222
+126 val_126
+90 val_90
+90 val_90
+90 val_90
+169 val_169
+169 val_169
+169 val_169
+169 val_169
+403 val_403
+403 val_403
+403 val_403
+400 val_400
+200 val_200
+200 val_200
+97 val_97
+97 val_97