milenkovicm commented on PR #1752:
URL:
https://github.com/apache/datafusion-ballista/pull/1752#issuecomment-4552853344
## Q72 (SF1) Fails
```
AdaptiveDatafusionExec: is_final=false, plan_id=2, stage_id=pending,
stage_resolved=false
SortPreservingMergeExec: [total_cnt@5 DESC, i_item_desc@0 ASC NULLS LAST,
w_warehouse_name@1 ASC NULLS LAST, d_week_seq@2 ASC NULLS LAST], fetch=100
SortExec: TopK(fetch=100), expr=[total_cnt@5 DESC, i_item_desc@0 ASC
NULLS LAST, w_warehouse_name@1 ASC NULLS LAST, d_week_seq@2 ASC NULLS LAST],
preserve_partitioning=[true]
ProjectionExec: expr=[i_item_desc@0 as i_item_desc, w_warehouse_name@1
as w_warehouse_name, d_week_seq@2 as d_week_seq, sum(CASE WHEN
promotion.p_promo_sk IS NULL THEN Int64(1) ELSE Int64(0) END)@3 as no_promo,
sum(CASE WHEN promotion.p_promo_sk IS NOT NULL THEN Int64(1) ELSE Int64(0)
END)@4 as promo, count(Int64(1))@5 as total_cnt]
AggregateExec: mode=FinalPartitioned, gby=[i_item_desc@0 as
i_item_desc, w_warehouse_name@1 as w_warehouse_name, d_week_seq@2 as
d_week_seq], aggr=[sum(CASE WHEN promotion.p_promo_sk IS NULL THEN Int64(1)
ELSE Int64(0) END), sum(CASE WHEN promotion.p_promo_sk IS NOT NULL THEN
Int64(1) ELSE Int64(0) END), count(Int64(1))]
ExchangeExec: partitioning=Hash([i_item_desc@0,
w_warehouse_name@1, d_week_seq@2], 14), plan_id=4, stage_id=3,
stage_resolved=false
AggregateExec: mode=Partial, gby=[i_item_desc@1 as i_item_desc,
w_warehouse_name@0 as w_warehouse_name, d_week_seq@2 as d_week_seq],
aggr=[sum(CASE WHEN promotion.p_promo_sk IS NULL THEN Int64(1) ELSE Int64(0)
END), sum(CASE WHEN promotion.p_promo_sk IS NOT NULL THEN Int64(1) ELSE
Int64(0) END), count(Int64(1))]
HashJoinExec: mode=CollectLeft, join_type=Left,
on=[(cs_item_sk@0, cr_item_sk@0), (cs_order_number@1, cr_order_number@1)],
projection=[w_warehouse_name@2, i_item_desc@3, d_week_seq@4, p_promo_sk@5]
ProjectionExec: expr=[cs_item_sk@1 as cs_item_sk,
cs_order_number@2 as cs_order_number, w_warehouse_name@3 as w_warehouse_name,
i_item_desc@4 as i_item_desc, d_week_seq@5 as d_week_seq, p_promo_sk@0 as
p_promo_sk]
HashJoinExec: mode=CollectLeft, join_type=Right,
on=[(p_promo_sk@0, cs_promo_sk@1)], projection=[p_promo_sk@0, cs_item_sk@1,
cs_order_number@3, w_warehouse_name@4, i_item_desc@5, d_week_seq@6]
DataSourceExec: file_groups={1 group:
[[Users/marko/TMP/tpcds_data/1g_parquet/promotion.parquet]]},
projection=[p_promo_sk], file_type=parquet
HashJoinExec: mode=CollectLeft, join_type=Inner,
on=[(cs_ship_date_sk@0, d_date_sk@0)], filter=d_date@1 > d_date@0 +
IntervalMonthDayNano { months: 0, days: 5, nanoseconds: 0 },
projection=[cs_item_sk@1, cs_promo_sk@2, cs_order_number@3, w_warehouse_name@4,
i_item_desc@5, d_week_seq@7]
HashJoinExec: mode=CollectLeft, join_type=Inner,
on=[(inv_date_sk@4, d_date_sk@0), (d_week_seq@8, d_week_seq@1)],
projection=[cs_ship_date_sk@0, cs_item_sk@1, cs_promo_sk@2, cs_order_number@3,
w_warehouse_name@5, i_item_desc@6, d_date@7, d_week_seq@8]
ProjectionExec: expr=[cs_ship_date_sk@2 as
cs_ship_date_sk, cs_item_sk@3 as cs_item_sk, cs_promo_sk@4 as cs_promo_sk,
cs_order_number@5 as cs_order_number, inv_date_sk@6 as inv_date_sk,
w_warehouse_name@7 as w_warehouse_name, i_item_desc@8 as i_item_desc, d_date@0
as d_date, d_week_seq@1 as d_week_seq]
HashJoinExec: mode=CollectLeft, join_type=Inner,
on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[d_date@1, d_week_seq@2,
cs_ship_date_sk@4, cs_item_sk@5, cs_promo_sk@6, cs_order_number@7,
inv_date_sk@8, w_warehouse_name@9, i_item_desc@10]
FilterExec: d_year@3 = 1999,
projection=[d_date_sk@0, d_date@1, d_week_seq@2]
DataSourceExec: file_groups={1 group:
[[Users/marko/TMP/tpcds_data/1g_parquet/date_dim.parquet]]},
projection=[d_date_sk, d_date, d_week_seq, d_year], file_type=parquet,
predicate=d_year@6 = 1999 AND d_year@6 = 1999 AND d_year@6 = 1999 AND d_year@6
= 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0
<= 1999 AND 1999 <= d_year_max@1 AND d_year_null_count@2 != row_count@3 AND
d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 AND d_year_null_count@2 !=
row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 AND
d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <=
d_year_max@1, required_guarantees=[d_year in (1999)]
HashJoinExec: mode=CollectLeft, join_type=Inner,
on=[(hd_demo_sk@0, cs_bill_hdemo_sk@2)], projection=[cs_sold_date_sk@1,
cs_ship_date_sk@2, cs_item_sk@4, cs_promo_sk@5, cs_order_number@6,
inv_date_sk@7, w_warehouse_name@8, i_item_desc@9]
FilterExec: hd_buy_potential@1 = 501-1000,
projection=[hd_demo_sk@0]
DataSourceExec: file_groups={1 group:
[[Users/marko/TMP/tpcds_data/1g_parquet/household_demographics.parquet]]},
projection=[hd_demo_sk, hd_buy_potential], file_type=parquet,
predicate=hd_buy_potential@2 = 501-1000 AND hd_buy_potential@2 = 501-1000 AND
hd_buy_potential@2 = 501-1000 AND hd_buy_potential@2 = 501-1000,
pruning_predicate=hd_buy_potential_null_count@2 != row_count@3 AND
hd_buy_potential_min@0 <= 501-1000 AND 501-1000 <= hd_buy_potential_max@1 AND
hd_buy_potential_null_count@2 != row_count@3 AND hd_buy_potential_min@0 <=
501-1000 AND 501-1000 <= hd_buy_potential_max@1 AND
hd_buy_potential_null_count@2 != row_count@3 AND hd_buy_potential_min@0 <=
501-1000 AND 501-1000 <= hd_buy_potential_max@1 AND
hd_buy_potential_null_count@2 != row_count@3 AND hd_buy_potential_min@0 <=
501-1000 AND 501-1000 <= hd_buy_potential_max@1,
required_guarantees=[hd_buy_potential in (501-1000)]
HashJoinExec: mode=CollectLeft,
join_type=Inner, on=[(cs_bill_cdemo_sk@2, cd_demo_sk@0)],
projection=[cs_sold_date_sk@0, cs_ship_date_sk@1, cs_bill_hdemo_sk@3,
cs_item_sk@4, cs_promo_sk@5, cs_order_number@6, inv_date_sk@7,
w_warehouse_name@8, i_item_desc@9]
HashJoinExec: mode=CollectLeft,
join_type=Inner, on=[(i_item_sk@0, cs_item_sk@4)],
projection=[cs_sold_date_sk@2, cs_ship_date_sk@3, cs_bill_cdemo_sk@4,
cs_bill_hdemo_sk@5, cs_item_sk@6, cs_promo_sk@7, cs_order_number@8,
inv_date_sk@9, w_warehouse_name@10, i_item_desc@1]
DataSourceExec: file_groups={1 group:
[[Users/marko/TMP/tpcds_data/1g_parquet/item.parquet]]}, projection=[i_item_sk,
i_item_desc], file_type=parquet, predicate=DynamicFilter [ empty ]
ExchangeExec: partitioning=None,
plan_id=3, stage_id=2, stage_resolved=true, broadcast=true
ProjectionExec: expr=[cs_sold_date_sk@1
as cs_sold_date_sk, cs_ship_date_sk@2 as cs_ship_date_sk, cs_bill_cdemo_sk@3 as
cs_bill_cdemo_sk, cs_bill_hdemo_sk@4 as cs_bill_hdemo_sk, cs_item_sk@5 as
cs_item_sk, cs_promo_sk@6 as cs_promo_sk, cs_order_number@7 as cs_order_number,
inv_date_sk@8 as inv_date_sk, w_warehouse_name@0 as w_warehouse_name]
HashJoinExec: mode=CollectLeft,
join_type=Inner, on=[(w_warehouse_sk@0, inv_warehouse_sk@8)],
projection=[w_warehouse_name@1, cs_sold_date_sk@2, cs_ship_date_sk@3,
cs_bill_cdemo_sk@4, cs_bill_hdemo_sk@5, cs_item_sk@6, cs_promo_sk@7,
cs_order_number@8, inv_date_sk@9]
DataSourceExec: file_groups={1
group: [[Users/marko/TMP/tpcds_data/1g_parquet/warehouse.parquet]]},
projection=[w_warehouse_sk, w_warehouse_name], file_type=parquet
ProjectionExec:
expr=[cs_sold_date_sk@0 as cs_sold_date_sk, cs_ship_date_sk@1 as
cs_ship_date_sk, cs_bill_cdemo_sk@2 as cs_bill_cdemo_sk, cs_bill_hdemo_sk@3 as
cs_bill_hdemo_sk, cs_item_sk@4 as cs_item_sk, cs_promo_sk@5 as cs_promo_sk,
cs_order_number@6 as cs_order_number, inv_date_sk@8 as inv_date_sk,
inv_warehouse_sk@10 as inv_warehouse_sk]
SortMergeJoinExec:
join_type=Inner, on=[(cs_item_sk@4, inv_item_sk@1)],
filter=inv_quantity_on_hand@1 < cs_quantity@0
SortExec: expr=[cs_item_sk@4
ASC], preserve_partitioning=[true]
ExchangeExec:
partitioning=Hash([cs_item_sk@4], 14), plan_id=0, stage_id=0,
stage_resolved=true
DataSourceExec:
file_groups={14 groups:
[[Users/marko/TMP/tpcds_data/1g_parquet/catalog_sales.parquet:0..7244714],
[Users/marko/TMP/tpcds_data/1g_parquet/catalog_sales.parquet:7244714..14489428],
[Users/marko/TMP/tpcds_data/1g_parquet/catalog_sales.parquet:14489428..21734142],
[Users/marko/TMP/tpcds_data/1g_parquet/catalog_sales.parquet:21734142..28978856],
[Users/marko/TMP/tpcds_data/1g_parquet/catalog_sales.parquet:28978856..36223570],
...]}, projection=[cs_sold_date_sk, cs_ship_date_sk, cs_bill_cdemo_sk,
cs_bill_hdemo_sk, cs_item_sk, cs_promo_sk, cs_order_number, cs_quantity],
file_type=parquet
SortExec: expr=[inv_item_sk@1
ASC], preserve_partitioning=[true]
ExchangeExec:
partitioning=Hash([inv_item_sk@1], 14), plan_id=1, stage_id=1,
stage_resolved=true
DataSourceExec:
file_groups={14 groups:
[[Users/marko/TMP/tpcds_data/1g_parquet/inventory.parquet:0..2725031],
[Users/marko/TMP/tpcds_data/1g_parquet/inventory.parquet:2725031..5450062],
[Users/marko/TMP/tpcds_data/1g_parquet/inventory.parquet:5450062..8175093],
[Users/marko/TMP/tpcds_data/1g_parquet/inventory.parquet:8175093..10900124],
[Users/marko/TMP/tpcds_data/1g_parquet/inventory.parquet:10900124..13625155],
...]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk,
inv_quantity_on_hand], file_type=parquet
FilterExec: cd_marital_status@1 = S,
projection=[cd_demo_sk@0]
DataSourceExec: file_groups={1 group:
[[Users/marko/TMP/tpcds_data/1g_parquet/customer_demographics.parquet]]},
projection=[cd_demo_sk, cd_marital_status], file_type=parquet,
predicate=cd_marital_status@2 = S AND cd_marital_status@2 = S AND
cd_marital_status@2 = S AND cd_marital_status@2 = S AND DynamicFilter [ empty
], pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND
cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND
cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S
AND S <= cd_marital_status_max@1 AND cd_marital_status_null_count@2 !=
row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1
AND cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0
<= S AND S <= cd_marital_status_max@1, required_guarantees=[cd_marital_status
in (S)]
DataSourceExec: file_groups={1 group:
[[Users/marko/TMP/tpcds_data/1g_parquet/date_dim.parquet]]},
projection=[d_date_sk, d_week_seq], file_type=parquet, predicate=DynamicFilter
[ empty ]
DataSourceExec: file_groups={1 group:
[[Users/marko/TMP/tpcds_data/1g_parquet/date_dim.parquet]]},
projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [
empty ]
DataSourceExec: file_groups={14 groups:
[[Users/marko/TMP/tpcds_data/1g_parquet/catalog_returns.parquet:0..806517],
[Users/marko/TMP/tpcds_data/1g_parquet/catalog_returns.parquet:806517..1613034],
[Users/marko/TMP/tpcds_data/1g_parquet/catalog_returns.parquet:1613034..2419551],
[Users/marko/TMP/tpcds_data/1g_parquet/catalog_returns.parquet:2419551..3226068],
[Users/marko/TMP/tpcds_data/1g_parquet/catalog_returns.parquet:3226068..4032585],
...]}, projection=[cr_item_sk, cr_order_number], file_type=parquet
```
stage 3 fails with (all running tasks):
`DataFusionError(Shared(Shared(Shared(Shared(ArrowError(OffsetOverflowError(2147506937),
Some(\"\")))))))\n")), None)`
```
SortShuffleWriterExec: partitioning=Hash([i_item_desc@0, w_warehouse_name@1,
d_week_seq@2], 14)
AggregateExec: mode=Partial, gby=[i_item_desc@1 as i_item_desc,
w_warehouse_name@0 as w_warehouse_name, d_week_seq@2 as d_week_seq],
aggr=[sum(CASE WHEN promotion.p_promo_sk IS NULL THEN Int64(1) ELSE Int64(0)
END), sum(CASE WHEN promotion.p_promo_sk IS NOT NULL THEN Int64(1) ELSE
Int64(0) END), count(Int64(1))]
HashJoinExec: mode=CollectLeft, join_type=Left, on=[(cs_item_sk@0,
cr_item_sk@0), (cs_order_number@1, cr_order_number@1)],
projection=[w_warehouse_name@2, i_item_desc@3, d_week_seq@4, p_promo_sk@5]
ProjectionExec: expr=[cs_item_sk@1 as cs_item_sk, cs_order_number@2 as
cs_order_number, w_warehouse_name@3 as w_warehouse_name, i_item_desc@4 as
i_item_desc, d_week_seq@5 as d_week_seq, p_promo_sk@0 as p_promo_sk]
HashJoinExec: mode=CollectLeft, join_type=Right, on=[(p_promo_sk@0,
cs_promo_sk@1)], projection=[p_promo_sk@0, cs_item_sk@1, cs_order_number@3,
w_warehouse_name@4, i_item_desc@5, d_week_seq@6]
DataSourceExec: file_groups={1 group:
[[Users/marko/TMP/tpcds_data/1g_parquet/promotion.parquet]]},
projection=[p_promo_sk], file_type=parquet
HashJoinExec: mode=CollectLeft, join_type=Inner,
on=[(cs_ship_date_sk@0, d_date_sk@0)], filter=d_date@1 > d_date@0 +
IntervalMonthDayNano { months: 0, days: 5, nanoseconds: 0 },
projection=[cs_item_sk@1, cs_promo_sk@2, cs_order_number@3, w_warehouse_name@4,
i_item_desc@5, d_week_seq@7]
HashJoinExec: mode=CollectLeft, join_type=Inner,
on=[(inv_date_sk@4, d_date_sk@0), (d_week_seq@8, d_week_seq@1)],
projection=[cs_ship_date_sk@0, cs_item_sk@1, cs_promo_sk@2, cs_order_number@3,
w_warehouse_name@5, i_item_desc@6, d_date@7, d_week_seq@8]
ProjectionExec: expr=[cs_ship_date_sk@2 as cs_ship_date_sk,
cs_item_sk@3 as cs_item_sk, cs_promo_sk@4 as cs_promo_sk, cs_order_number@5 as
cs_order_number, inv_date_sk@6 as inv_date_sk, w_warehouse_name@7 as
w_warehouse_name, i_item_desc@8 as i_item_desc, d_date@0 as d_date,
d_week_seq@1 as d_week_seq]
HashJoinExec: mode=CollectLeft, join_type=Inner,
on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[d_date@1, d_week_seq@2,
cs_ship_date_sk@4, cs_item_sk@5, cs_promo_sk@6, cs_order_number@7,
inv_date_sk@8, w_warehouse_name@9, i_item_desc@10]
FilterExec: d_year@3 = 1999, projection=[d_date_sk@0,
d_date@1, d_week_seq@2]
DataSourceExec: file_groups={1 group:
[[Users/marko/TMP/tpcds_data/1g_parquet/date_dim.parquet]]},
projection=[d_date_sk, d_date, d_week_seq, d_year], file_type=parquet,
predicate=d_year@6 = 1999 AND d_year@6 = 1999 AND d_year@6 = 1999 AND d_year@6
= 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0
<= 1999 AND 1999 <= d_year_max@1 AND d_year_null_count@2 != row_count@3 AND
d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 AND d_year_null_count@2 !=
row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 AND
d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <=
d_year_max@1, required_guarantees=[d_year in (1999)]
HashJoinExec: mode=CollectLeft, join_type=Inner,
on=[(hd_demo_sk@0, cs_bill_hdemo_sk@2)], projection=[cs_sold_date_sk@1,
cs_ship_date_sk@2, cs_item_sk@4, cs_promo_sk@5, cs_order_number@6,
inv_date_sk@7, w_warehouse_name@8, i_item_desc@9]
FilterExec: hd_buy_potential@1 = 501-1000,
projection=[hd_demo_sk@0]
DataSourceExec: file_groups={1 group:
[[Users/marko/TMP/tpcds_data/1g_parquet/household_demographics.parquet]]},
projection=[hd_demo_sk, hd_buy_potential], file_type=parquet,
predicate=hd_buy_potential@2 = 501-1000 AND hd_buy_potential@2 = 501-1000 AND
hd_buy_potential@2 = 501-1000 AND hd_buy_potential@2 = 501-1000,
pruning_predicate=hd_buy_potential_null_count@2 != row_count@3 AND
hd_buy_potential_min@0 <= 501-1000 AND 501-1000 <= hd_buy_potential_max@1 AND
hd_buy_potential_null_count@2 != row_count@3 AND hd_buy_potential_min@0 <=
501-1000 AND 501-1000 <= hd_buy_potential_max@1 AND
hd_buy_potential_null_count@2 != row_count@3 AND hd_buy_potential_min@0 <=
501-1000 AND 501-1000 <= hd_buy_potential_max@1 AND
hd_buy_potential_null_count@2 != row_count@3 AND hd_buy_potential_min@0 <=
501-1000 AND 501-1000 <= hd_buy_potential_max@1,
required_guarantees=[hd_buy_potential in (501-1000)]
HashJoinExec: mode=CollectLeft, join_type=Inner,
on=[(cs_bill_cdemo_sk@2, cd_demo_sk@0)], projection=[cs_sold_date_sk@0,
cs_ship_date_sk@1, cs_bill_hdemo_sk@3, cs_item_sk@4, cs_promo_sk@5,
cs_order_number@6, inv_date_sk@7, w_warehouse_name@8, i_item_desc@9]
HashJoinExec: mode=CollectLeft, join_type=Inner,
on=[(i_item_sk@0, cs_item_sk@4)], projection=[cs_sold_date_sk@2,
cs_ship_date_sk@3, cs_bill_cdemo_sk@4, cs_bill_hdemo_sk@5, cs_item_sk@6,
cs_promo_sk@7, cs_order_number@8, inv_date_sk@9, w_warehouse_name@10,
i_item_desc@1]
DataSourceExec: file_groups={1 group:
[[Users/marko/TMP/tpcds_data/1g_parquet/item.parquet]]}, projection=[i_item_sk,
i_item_desc], file_type=parquet, predicate=DynamicFilter [ empty ]
ShuffleReaderExec: upstream_stage: 2, broadcast:
true, upstream_partition_count: 14
FilterExec: cd_marital_status@1 = S,
projection=[cd_demo_sk@0]
DataSourceExec: file_groups={1 group:
[[Users/marko/TMP/tpcds_data/1g_parquet/customer_demographics.parquet]]},
projection=[cd_demo_sk, cd_marital_status], file_type=parquet,
predicate=cd_marital_status@2 = S AND cd_marital_status@2 = S AND
cd_marital_status@2 = S AND cd_marital_status@2 = S AND DynamicFilter [ empty
], pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND
cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND
cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S
AND S <= cd_marital_status_max@1 AND cd_marital_status_null_count@2 !=
row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1
AND cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0
<= S AND S <= cd_marital_status_max@1, required_guarantees=[cd_marital_status
in (S)]
DataSourceExec: file_groups={1 group:
[[Users/marko/TMP/tpcds_data/1g_parquet/date_dim.parquet]]},
projection=[d_date_sk, d_week_seq], file_type=parquet, predicate=DynamicFilter
[ empty ]
DataSourceExec: file_groups={1 group:
[[Users/marko/TMP/tpcds_data/1g_parquet/date_dim.parquet]]},
projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [
empty ]
DataSourceExec: file_groups={14 groups:
[[Users/marko/TMP/tpcds_data/1g_parquet/catalog_returns.parquet:0..806517],
[Users/marko/TMP/tpcds_data/1g_parquet/catalog_returns.parquet:806517..1613034],
[Users/marko/TMP/tpcds_data/1g_parquet/catalog_returns.parquet:1613034..2419551],
[Users/marko/TMP/tpcds_data/1g_parquet/catalog_returns.parquet:2419551..3226068],
[Users/marko/TMP/tpcds_data/1g_parquet/catalog_returns.parquet:3226068..4032585],
...]}, projection=[cr_item_sk, cr_order_number], file_type=parquet
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]