diff --git a/.travis.yml b/.travis.yml
index 2d7eddf950dea628e35108418d0f663993578d60..cee9ec6db72f4f84da037faafae6dc15db6a23cc 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -16,13 +16,20 @@ before_install:
# For pylint dockstring checker
- sudo apt-get update
- sudo apt-get install -y python-pip libpython-dev
+ - sudo apt-get remove python-urllib3
+ - sudo apt-get purge python-urllib3
+ - sudo rm /usr/lib/python2.7/dist-packages/chardet-*
- sudo pip install -U pip
+ - sudo pip install --upgrade setuptools
- sudo pip install six --upgrade --ignore-installed six
- - sudo pip install pillow
- sudo pip install PyYAML
- sudo pip install pylint pytest astroid isort pre-commit
- sudo pip install kiwisolver
- - sudo pip install paddlepaddle==1.7.2 --ignore-installed urllib3
+ - sudo pip install scikit-build
+ - sudo pip install Pillow==5.3.0
+ - sudo pip install opencv-python==3.4.3.18
+ - sudo pip install rarfile==3.0
+ - sudo pip install paddlepaddle==1.7.2
- sudo python setup.py install
- |
function timeout() { perl -e 'alarm shift; exec @ARGV' "$@"; }
diff --git a/README.md b/README.md
index 86f45a9e192b6c2e3d3b5339e45eae399b99911f..84c53d2a06ee7b52ae7c89187fb0316730390f01 100644
--- a/README.md
+++ b/README.md
@@ -1,105 +1,111 @@
-([简体中文](./README_CN.md)|English)
+(简体中文|[English](./README_EN.md))
+
-
+
+
+
+
-
What is recommendation system ?
+什么是推荐系统?
-
+
-- Recommendation system helps users quickly find useful and interesting information from massive data.
-
-- Recommendation system is also a silver bullet to attract users, retain users, increase users' stickness or conversionn.
-
- > Who can better use the recommendation system, who can gain more advantage in the fierce competition.
- >
- > At the same time, there are many problems in the process of using the recommendation system, such as: huge data, complex model, inefficient distributed training, and so on.
-
-
What is PaddleRec ?
-
-
-- A quick start tool of search & recommendation algorithm based on [PaddlePaddle](https://www.paddlepaddle.org.cn/documentation/docs/en/beginners_guide/index_en.html)
-- A complete solution of recommendation system for beginners, developers and researchers.
-- Recommendation algorithm library including content-understanding, match, recall, rank, multi-task, re-rank etc.
-
-
- | Type | Algorithm | CPU | GPU | Parameter-Server | Multi-GPU | Paper |
- | :-------------------: | :-----------------------------------------------------------------------: | :---: | :-----: | :--------------: | :-------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
- | Content-Understanding | [Text-Classifcation](models/contentunderstanding/classification/model.py) | ✓ | ✓ | ✓ | x | [EMNLP 2014][Convolutional neural networks for sentence classication](https://www.aclweb.org/anthology/D14-1181.pdf) |
- | Content-Understanding | [TagSpace](models/contentunderstanding/tagspace/model.py) | ✓ | ✓ | ✓ | x | [EMNLP 2014][TagSpace: Semantic Embeddings from Hashtags](https://www.aclweb.org/anthology/D14-1194.pdf) |
- | Match | [DSSM](models/match/dssm/model.py) | ✓ | ✓ | ✓ | x | [CIKM 2013][Learning Deep Structured Semantic Models for Web Search using Clickthrough Data](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/cikm2013_DSSM_fullversion.pdf) |
- | Match | [MultiView-Simnet](models/match/multiview-simnet/model.py) | ✓ | ✓ | ✓ | x | [WWW 2015][A Multi-View Deep Learning Approach for Cross Domain User Modeling in Recommendation Systems](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/frp1159-songA.pdf) |
- | Recall | [TDM](models/treebased/tdm/model.py) | ✓ | >=1.8.0 | ✓ | >=1.8.0 | [KDD 2018][Learning Tree-based Deep Model for Recommender Systems](https://arxiv.org/pdf/1801.02294.pdf) |
- | Recall | [fasttext](models/recall/fasttext/model.py) | ✓ | ✓ | x | x | [EACL 2017][Bag of Tricks for Efficient Text Classification](https://www.aclweb.org/anthology/E17-2068.pdf) |
- | Recall | [Word2Vec](models/recall/word2vec/model.py) | ✓ | ✓ | ✓ | x | [NIPS 2013][Distributed Representations of Words and Phrases and their Compositionality](https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf) |
- | Recall | [SSR](models/recall/ssr/model.py) | ✓ | ✓ | ✓ | ✓ | [SIGIR 2016][Multi-Rate Deep Learning for Temporal Recommendation](http://sonyis.me/paperpdf/spr209-song_sigir16.pdf) |
- | Recall | [Gru4Rec](models/recall/gru4rec/model.py) | ✓ | ✓ | ✓ | ✓ | [2015][Session-based Recommendations with Recurrent Neural Networks](https://arxiv.org/abs/1511.06939) |
- | Recall | [Youtube_dnn](models/recall/youtube_dnn/model.py) | ✓ | ✓ | ✓ | ✓ | [RecSys 2016][Deep Neural Networks for YouTube Recommendations](https://static.googleusercontent.com/media/research.google.com/zh-CN//pubs/archive/45530.pdf) |
- | Recall | [NCF](models/recall/ncf/model.py) | ✓ | ✓ | ✓ | ✓ | [WWW 2017][Neural Collaborative Filtering](https://arxiv.org/pdf/1708.05031.pdf) |
- | Recall | [GNN](models/recall/gnn/model.py) | ✓ | ✓ | ✓ | ✓ | [AAAI 2019][Session-based Recommendation with Graph Neural Networks](https://arxiv.org/abs/1811.00855) |
- | Rank | [Logistic Regression](models/rank/logistic_regression/model.py) | ✓ | x | ✓ | x | / |
- | Rank | [Dnn](models/rank/dnn/model.py) | ✓ | ✓ | ✓ | ✓ | / |
- | Rank | [FM](models/rank/fm/model.py) | ✓ | x | ✓ | x | [IEEE Data Mining 2010][Factorization machines](https://analyticsconsultores.com.mx/wp-content/uploads/2019/03/Factorization-Machines-Steffen-Rendle-Osaka-University-2010.pdf) |
- | Rank | [FFM](models/rank/ffm/model.py) | ✓ | x | ✓ | x | [RECSYS 2016][Field-aware Factorization Machines for CTR Prediction](https://dl.acm.org/doi/pdf/10.1145/2959100.2959134) |
- | Rank | [FNN](models/rank/fnn/model.py) | ✓ | x | ✓ | x | [ECIR 2016][Deep Learning over Multi-field Categorical Data](https://arxiv.org/pdf/1601.02376.pdf) |
- | Rank | [Deep Crossing](models/rank/deep_crossing/model.py) | ✓ | x | ✓ | x | [ACM 2016][Deep Crossing: Web-Scale Modeling without Manually Crafted Combinatorial Features](https://www.kdd.org/kdd2016/papers/files/adf0975-shanA.pdf) |
- | Rank | [Pnn](models/rank/pnn/model.py) | ✓ | x | ✓ | x | [ICDM 2016][Product-based Neural Networks for User Response Prediction](https://arxiv.org/pdf/1611.00144.pdf) |
- | Rank | [DCN](models/rank/dcn/model.py) | ✓ | x | ✓ | x | [KDD 2017][Deep & Cross Network for Ad Click Predictions](https://dl.acm.org/doi/pdf/10.1145/3124749.3124754) |
- | Rank | [NFM](models/rank/nfm/model.py) | ✓ | x | ✓ | x | [SIGIR 2017][Neural Factorization Machines for Sparse Predictive Analytics](https://dl.acm.org/doi/pdf/10.1145/3077136.3080777) |
- | Rank | [AFM](models/rank/afm/model.py) | ✓ | x | ✓ | x | [IJCAI 2017][Attentional Factorization Machines: Learning the Weight of Feature Interactions via Attention Networks](https://arxiv.org/pdf/1708.04617.pdf) |
- | Rank | [DeepFM](models/rank/deepfm/model.py) | ✓ | x | ✓ | x | [IJCAI 2017][DeepFM: A Factorization-Machine based Neural Network for CTR Prediction](https://arxiv.org/pdf/1703.04247.pdf) |
- | Rank | [xDeepFM](models/rank/xdeepfm/model.py) | ✓ | x | ✓ | x | [KDD 2018][xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systems](https://dl.acm.org/doi/pdf/10.1145/3219819.3220023) |
- | Rank | [DIN](models/rank/din/model.py) | ✓ | x | ✓ | x | [KDD 2018][Deep Interest Network for Click-Through Rate Prediction](https://dl.acm.org/doi/pdf/10.1145/3219819.3219823) |
- | Rank | [DIEN](models/rank/dien/model.py) | ✓ | x | ✓ | x | [AAAI 2019][Deep Interest Evolution Network for Click-Through Rate Prediction](https://www.aaai.org/ojs/index.php/AAAI/article/view/4545/4423) |
- | Rank | [BST](models/rank/BST/model.py) | ✓ | x | ✓ | x | [DLP-KDD 2019][Behavior Sequence Transformer for E-commerce Recommendation in Alibaba](https://arxiv.org/pdf/1905.06874v1.pdf) |
- | Rank | [AutoInt](models/rank/AutoInt/model.py) | ✓ | x | ✓ | x | [CIKM 2019][AutoInt: Automatic Feature Interaction Learning via Self-Attentive Neural Networks](https://arxiv.org/pdf/1810.11921.pdf) |
- | Rank | [Wide&Deep](models/rank/wide_deep/model.py) | ✓ | x | ✓ | x | [DLRS 2016][Wide & Deep Learning for Recommender Systems](https://dl.acm.org/doi/pdf/10.1145/2988450.2988454) |
- | Rank | [FGCNN](models/rank/fgcnn/model.py) | ✓ | ✓ | ✓ | ✓ | [WWW 2019][Feature Generation by Convolutional Neural Network for Click-Through Rate Prediction](https://arxiv.org/pdf/1904.04447.pdf) |
- | Rank | [Fibinet](models/rank/fibinet/model.py) | ✓ | ✓ | ✓ | ✓ | [RecSys19][FiBiNET: Combining Feature Importance and Bilinear feature Interaction for Click-Through Rate Prediction]( https://arxiv.org/pdf/1905.09433.pdf) |
- | Rank | [Flen](models/rank/flen/model.py) | ✓ | ✓ | ✓ | ✓ | [2019][FLEN: Leveraging Field for Scalable CTR Prediction]( https://arxiv.org/pdf/1911.04690.pdf) |
- | Multi-Task | [ESMM](models/multitask/esmm/model.py) | ✓ | ✓ | ✓ | ✓ | [SIGIR 2018][Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate](https://arxiv.org/abs/1804.07931) |
- | Multi-Task | [MMOE](models/multitask/mmoe/model.py) | ✓ | ✓ | ✓ | ✓ | [KDD 2018][Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts](https://dl.acm.org/doi/abs/10.1145/3219819.3220007) |
- | Multi-Task | [ShareBottom](models/multitask/share-bottom/model.py) | ✓ | ✓ | ✓ | ✓ | [1998][Multitask learning](http://reports-archive.adm.cs.cmu.edu/anon/1997/CMU-CS-97-203.pdf) |
- | Re-Rank | [Listwise](models/rerank/listwise/model.py) | ✓ | ✓ | ✓ | x | [2019][Sequential Evaluation and Generation Framework for Combinatorial Recommender System](https://arxiv.org/pdf/1902.00245.pdf) |
-
-
-
-
-
-Getting Started
-
-### Environmental requirements
+- 推荐系统是在互联网信息爆炸式增长的时代背景下,帮助用户高效获得感兴趣信息的关键;
+
+- 推荐系统也是帮助产品最大限度吸引用户、留存用户、增加用户粘性、提高用户转化率的银弹。
+
+- 有无数优秀的产品依靠用户可感知的推荐系统建立了良好的口碑,也有无数的公司依靠直击用户痛点的推荐系统在行业中占领了一席之地。
+
+ > 可以说,谁能掌握和利用好推荐系统,谁就能在信息分发的激烈竞争中抢得先机。
+ > 但与此同时,有着许多问题困扰着推荐系统的开发者,比如:庞大的数据量,复杂的模型结构,低效的分布式训练环境,波动的在离线一致性,苛刻的上线部署要求,以上种种,不胜枚举。
+
+什么是PaddleRec?
+
+
+- 源于飞桨生态的搜索推荐模型 **一站式开箱即用工具**
+- 适合初学者,开发者,研究者的推荐系统全流程解决方案
+- 包含内容理解、匹配、召回、排序、 多任务、重排序等多个任务的完整推荐搜索算法库
+
+
+ | 方向 | 模型 | 单机CPU | 单机GPU | 分布式CPU | 分布式GPU | 论文 |
+ | :------: | :-----------------------------------------------------------------------: | :-----: | :-----: | :-------: | :-------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | 内容理解 | [Text-Classifcation](models/contentunderstanding/classification/model.py) | ✓ | ✓ | ✓ | x | [EMNLP 2014][Convolutional neural networks for sentence classication](https://www.aclweb.org/anthology/D14-1181.pdf) |
+ | 内容理解 | [TagSpace](models/contentunderstanding/tagspace/model.py) | ✓ | ✓ | ✓ | x | [EMNLP 2014][TagSpace: Semantic Embeddings from Hashtags](https://www.aclweb.org/anthology/D14-1194.pdf) |
+ | 匹配 | [DSSM](models/match/dssm/model.py) | ✓ | ✓ | ✓ | x | [CIKM 2013][Learning Deep Structured Semantic Models for Web Search using Clickthrough Data](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/cikm2013_DSSM_fullversion.pdf) |
+ | 匹配 | [MultiView-Simnet](models/match/multiview-simnet/model.py) | ✓ | ✓ | ✓ | x | [WWW 2015][A Multi-View Deep Learning Approach for Cross Domain User Modeling in Recommendation Systems](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/frp1159-songA.pdf) |
+ | 召回 | [TDM](models/treebased/tdm/model.py) | ✓ | >=1.8.0 | ✓ | >=1.8.0 | [KDD 2018][Learning Tree-based Deep Model for Recommender Systems](https://arxiv.org/pdf/1801.02294.pdf) |
+ | 召回 | [fasttext](models/recall/fasttext/model.py) | ✓ | ✓ | x | x | [EACL 2017][Bag of Tricks for Efficient Text Classification](https://www.aclweb.org/anthology/E17-2068.pdf) |
+ | 召回 | [Word2Vec](models/recall/word2vec/model.py) | ✓ | ✓ | ✓ | x | [NIPS 2013][Distributed Representations of Words and Phrases and their Compositionality](https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf) |
+ | 召回 | [SSR](models/recall/ssr/model.py) | ✓ | ✓ | ✓ | ✓ | [SIGIR 2016][Multi-Rate Deep Learning for Temporal Recommendation](http://sonyis.me/paperpdf/spr209-song_sigir16.pdf) |
+ | 召回 | [Gru4Rec](models/recall/gru4rec/model.py) | ✓ | ✓ | ✓ | ✓ | [2015][Session-based Recommendations with Recurrent Neural Networks](https://arxiv.org/abs/1511.06939) |
+ | 召回 | [Youtube_dnn](models/recall/youtube_dnn/model.py) | ✓ | ✓ | ✓ | ✓ | [RecSys 2016][Deep Neural Networks for YouTube Recommendations](https://static.googleusercontent.com/media/research.google.com/zh-CN//pubs/archive/45530.pdf) |
+ | 召回 | [NCF](models/recall/ncf/model.py) | ✓ | ✓ | ✓ | ✓ | [WWW 2017][Neural Collaborative Filtering](https://arxiv.org/pdf/1708.05031.pdf) |
+ | 召回 | [GNN](models/recall/gnn/model.py) | ✓ | ✓ | ✓ | ✓ | [AAAI 2019][Session-based Recommendation with Graph Neural Networks](https://arxiv.org/abs/1811.00855) |
+ | 召回 | [RALM](models/recall/look-alike_recall/model.py) | ✓ | ✓ | ✓ | ✓ | [KDD 2019][Real-time Attention Based Look-alike Model for Recommender System](https://arxiv.org/pdf/1906.05022.pdf) |
+ | 排序 | [Logistic Regression](models/rank/logistic_regression/model.py) | ✓ | x | ✓ | x | / |
+ | 排序 | [Dnn](models/rank/dnn/model.py) | ✓ | ✓ | ✓ | ✓ | / |
+ | 排序 | [FM](models/rank/fm/model.py) | ✓ | x | ✓ | x | [IEEE Data Mining 2010][Factorization machines](https://analyticsconsultores.com.mx/wp-content/uploads/2019/03/Factorization-Machines-Steffen-Rendle-Osaka-University-2010.pdf) |
+ | 排序 | [FFM](models/rank/ffm/model.py) | ✓ | x | ✓ | x | [RECSYS 2016][Field-aware Factorization Machines for CTR Prediction](https://dl.acm.org/doi/pdf/10.1145/2959100.2959134) |
+ | 排序 | [FNN](models/rank/fnn/model.py) | ✓ | x | ✓ | x | [ECIR 2016][Deep Learning over Multi-field Categorical Data](https://arxiv.org/pdf/1601.02376.pdf) |
+ | 排序 | [Deep Crossing](models/rank/deep_crossing/model.py) | ✓ | x | ✓ | x | [ACM 2016][Deep Crossing: Web-Scale Modeling without Manually Crafted Combinatorial Features](https://www.kdd.org/kdd2016/papers/files/adf0975-shanA.pdf) |
+ | 排序 | [Pnn](models/rank/pnn/model.py) | ✓ | x | ✓ | x | [ICDM 2016][Product-based Neural Networks for User Response Prediction](https://arxiv.org/pdf/1611.00144.pdf) |
+ | 排序 | [DCN](models/rank/dcn/model.py) | ✓ | x | ✓ | x | [KDD 2017][Deep & Cross Network for Ad Click Predictions](https://dl.acm.org/doi/pdf/10.1145/3124749.3124754) |
+ | 排序 | [NFM](models/rank/nfm/model.py) | ✓ | x | ✓ | x | [SIGIR 2017][Neural Factorization Machines for Sparse Predictive Analytics](https://dl.acm.org/doi/pdf/10.1145/3077136.3080777) |
+ | 排序 | [AFM](models/rank/afm/model.py) | ✓ | x | ✓ | x | [IJCAI 2017][Attentional Factorization Machines: Learning the Weight of Feature Interactions via Attention Networks](https://arxiv.org/pdf/1708.04617.pdf) |
+ | 排序 | [DeepFM](models/rank/deepfm/model.py) | ✓ | x | ✓ | x | [IJCAI 2017][DeepFM: A Factorization-Machine based Neural Network for CTR Prediction](https://arxiv.org/pdf/1703.04247.pdf) |
+ | 排序 | [xDeepFM](models/rank/xdeepfm/model.py) | ✓ | x | ✓ | x | [KDD 2018][xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systems](https://dl.acm.org/doi/pdf/10.1145/3219819.3220023) |
+ | 排序 | [DIN](models/rank/din/model.py) | ✓ | x | ✓ | x | [KDD 2018][Deep Interest Network for Click-Through Rate Prediction](https://dl.acm.org/doi/pdf/10.1145/3219819.3219823) |
+ | 排序 | [DIEN](models/rank/dien/model.py) | ✓ | x | ✓ | x | [AAAI 2019][Deep Interest Evolution Network for Click-Through Rate Prediction](https://www.aaai.org/ojs/index.php/AAAI/article/view/4545/4423) |
+ | 排序 | [BST](models/rank/BST/model.py) | ✓ | x | ✓ | x | [DLP_KDD 2019][Behavior Sequence Transformer for E-commerce Recommendation in Alibaba](https://arxiv.org/pdf/1905.06874v1.pdf) |
+ | 排序 | [AutoInt](models/rank/AutoInt/model.py) | ✓ | x | ✓ | x | [CIKM 2019][AutoInt: Automatic Feature Interaction Learning via Self-Attentive Neural Networks](https://arxiv.org/pdf/1810.11921.pdf) |
+ | 排序 | [Wide&Deep](models/rank/wide_deep/model.py) | ✓ | x | ✓ | x | [DLRS 2016][Wide & Deep Learning for Recommender Systems](https://dl.acm.org/doi/pdf/10.1145/2988450.2988454) |
+ | 排序 | [FGCNN](models/rank/fgcnn/model.py) | ✓ | ✓ | ✓ | ✓ | [WWW 2019][Feature Generation by Convolutional Neural Network for Click-Through Rate Prediction](https://arxiv.org/pdf/1904.04447.pdf) |
+ | 排序 | [Fibinet](models/rank/fibinet/model.py) | ✓ | ✓ | ✓ | ✓ | [RecSys19][FiBiNET: Combining Feature Importance and Bilinear feature Interaction for Click-Through Rate Prediction]( https://arxiv.org/pdf/1905.09433.pdf) |
+ | 排序 | [Flen](models/rank/flen/model.py) | ✓ | ✓ | ✓ | ✓ | [2019][FLEN: Leveraging Field for Scalable CTR Prediction]( https://arxiv.org/pdf/1911.04690.pdf) |
+ | 多任务 | [ESMM](models/multitask/esmm/model.py) | ✓ | ✓ | ✓ | ✓ | [SIGIR 2018][Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate](https://arxiv.org/abs/1804.07931) |
+ | 多任务 | [MMOE](models/multitask/mmoe/model.py) | ✓ | ✓ | ✓ | ✓ | [KDD 2018][Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts](https://dl.acm.org/doi/abs/10.1145/3219819.3220007) |
+ | 多任务 | [ShareBottom](models/multitask/share-bottom/model.py) | ✓ | ✓ | ✓ | ✓ | [1998][Multitask learning](http://reports-archive.adm.cs.cmu.edu/anon/1997/CMU-CS-97-203.pdf) |
+ | 重排序 | [Listwise](models/rerank/listwise/model.py) | ✓ | ✓ | ✓ | x | [2019][Sequential Evaluation and Generation Framework for Combinatorial Recommender System](https://arxiv.org/pdf/1902.00245.pdf) |
+
+
+
+
+
+快速安装
+
+### 环境要求
* Python 2.7/ 3.5 / 3.6 / 3.7
* PaddlePaddle >= 1.7.2
-* operating system: Windows/Mac/Linux
+* 操作系统: Windows/Mac/Linux
- > Linux is recommended for distributed training
+ > Windows下PaddleRec目前仅支持单机训练,分布式训练建议使用Linux环境
-### Installation
+### 安装命令
-1. **Install by pip**
+- 安装方法一 **PIP源直接安装**
```bash
python -m pip install paddle-rec
```
- > This method will download and install `paddlepaddle-v1.7.2-cpu`. If `PaddlePaddle` can not be installed automatically,You need to install `PaddlePaddle` manually,and then install `PaddleRec` again:
- > - Download [PaddlePaddle](https://pypi.org/project/paddlepaddle/1.7.2/#files) and install by pip.
- > - Install `PaddlePaddle` by pip,`python -m pip install paddlepaddle==1.7.2 -i https://mirror.baidu.com/pypi/simple`
- > - Other installation problems can be raised in [Paddle Issue](https://github.com/PaddlePaddle/Paddle/issues) or [PaddleRec Issue](https://github.com/PaddlePaddle/PaddleRec/issues)
+ > 该方法会默认下载安装`paddlepaddle v1.7.2 cpu版本`,若提示`PaddlePaddle`无法安装,则依照下述方法首先安装`PaddlePaddle`,再安装`PaddleRec`:
+ > - 可以在[该地址](https://pypi.org/project/paddlepaddle/1.7.2/#files),下载PaddlePaddle后手动安装whl包
+ > - 可以先pip安装`PaddlePaddle`,`python -m pip install paddlepaddle==1.7.2 -i https://mirror.baidu.com/pypi/simple`
+ > - 其他安装问题可以在[Paddle Issue](https://github.com/PaddlePaddle/Paddle/issues)或[PaddleRec Issue](https://github.com/PaddlePaddle/PaddleRec/issues)提出,会有工程师及时解答
-2. **Install by source code**
-
- - Install PaddlePaddle
+- 安装方法二 **源码编译安装**
+
+ - 安装飞桨 **注:需要用户安装版本 == 1.7.2 的飞桨**
```shell
python -m pip install paddlepaddle==1.7.2 -i https://mirror.baidu.com/pypi/simple
```
- - Install PaddleRec by source code
+ - 源码安装PaddleRec
```
git clone https://github.com/PaddlePaddle/PaddleRec/
@@ -107,54 +113,58 @@
python setup.py install
```
-- Install PaddleRec-GPU
+- PaddleRec-GPU安装方法
- After installing `PaddleRec`,please install the appropriate version of `paddlepaddle-gpu` according to your environment (CUDA / cudnn),refer to the installation tutorial [Installation Manuals](https://www.paddlepaddle.org.cn/documentation/docs/en/install/index_en.html)
+ 在使用方法一或方法二完成PaddleRec安装后,需再手动安装`paddlepaddle-gpu`,并根据自身环境(Cuda/Cudnn)选择合适的版本,安装教程请查阅[飞桨-开始使用](https://www.paddlepaddle.org.cn/install/quick)
-Quick Start
+一键启动
-We take the `dnn` algorithm as an example to get start of `PaddleRec`, and we take 100 pieces of training data from [Criteo Dataset](https://www.kaggle.com/c/criteo-display-ad-challenge/):
+我们以排序模型中的`dnn`模型为例介绍PaddleRec的一键启动。训练数据来源为[Criteo数据集](https://www.kaggle.com/c/criteo-display-ad-challenge/),我们从中截取了100条数据:
```bash
-# Training with cpu
-python -m paddlerec.run -m paddlerec.models.rank.dnn
+# 使用CPU进行单机训练
+git clone https://github.com/PaddlePaddle/PaddleRec.git paddle-rec
+cd paddle-rec
+
+python -m paddlerec.run -m models/rank/dnn/config.yaml
```
-Documentation
+帮助文档
-### Background
-* [Recommendation System](doc/rec_background.md)
-* [Distributed deep learning](doc/ps_background.md)
+### 项目背景
+* [推荐系统介绍](doc/rec_background.md)
+* [分布式深度学习介绍](doc/ps_background.md)
-### Introductory Project
-* [Get start of PaddleRec in ten minutes](https://aistudio.baidu.com/aistudio/projectdetail/559336)
+### 快速开始
+* [十分钟上手PaddleRec](https://aistudio.baidu.com/aistudio/projectdetail/559336)
-### Introductory tutorial
-* [Data](doc/slot_reader.md)
-* [Model](doc/model.md)
-* [Loacl Train](doc/train.md)
-* [Distributed Train](doc/distributed_train.md)
-* [Predict](doc/predict.md)
-* [Serving](doc/serving.md)
+### 入门教程
+* [数据准备](doc/slot_reader.md)
+* [模型调参](doc/model.md)
+* [启动单机训练](doc/train.md)
+* [启动分布式训练](doc/distributed_train.md)
+* [启动预测](doc/predict.md)
+* [快速部署](doc/serving.md)
+* [预训练模型](doc/pre_train_model.md)
-### Advanced tutorial
-* [Custom Reader](doc/custom_reader.md)
-* [Custom Model](doc/model_develop.md)
-* [Custom Training Process](doc/trainer_develop.md)
-* [Configuration description of yaml](doc/yaml.md)
-* [Design document of PaddleRec](doc/design.md)
+### 进阶教程
+* [自定义Reader](doc/custom_reader.md)
+* [自定义模型](doc/model_develop.md)
+* [自定义流程](doc/trainer_develop.md)
+* [yaml配置说明](doc/yaml.md)
+* [PaddleRec设计文档](doc/design.md)
### Benchmark
* [Benchmark](doc/benchmark.md)
### FAQ
-* [Common Problem FAQ](doc/faq.md)
+* [常见问题FAQ](doc/faq.md)
-Community
+社区
@@ -164,22 +174,22 @@ python -m paddlerec.run -m paddlerec.models.rank.dnn
-### Version history
+### 版本历史
- 2020.06.17 - PaddleRec v0.1.0
- 2020.06.03 - PaddleRec v0.0.2
- 2020.05.14 - PaddleRec v0.0.1
-### License
-[Apache 2.0 license](LICENSE)
+### 许可证书
+本项目的发布受[Apache 2.0 license](LICENSE)许可认证。
-### Contact us
+### 联系我们
-For any feedback, please propose a [GitHub Issue](https://github.com/PaddlePaddle/PaddleRec/issues)
+如有意见、建议及使用中的BUG,欢迎在[GitHub Issue](https://github.com/PaddlePaddle/PaddleRec/issues)提交
-You can also communicate with us in the following ways:
+亦可通过以下方式与我们沟通交流:
-- QQ group id:`861717190`
-- Wechat account:`paddlerec2020`
+- QQ群号码:`861717190`
+- 微信小助手微信号:`paddlerec2020`
-PaddleRec QQ Group PaddleRec Wechat account
+PaddleRec交流QQ群 PaddleRec微信小助手
diff --git a/README_CN.md b/README_CN.md
deleted file mode 100644
index 2b6d57f48163dad3dee12cab0aeb3a7b4d6a8920..0000000000000000000000000000000000000000
--- a/README_CN.md
+++ /dev/null
@@ -1,190 +0,0 @@
-(简体中文|[English](./README.md))
-
-
-
-
-
-
-
-
-
-
-
-
-
什么是推荐系统?
-
-
-
-
-- 推荐系统是在互联网信息爆炸式增长的时代背景下,帮助用户高效获得感兴趣信息的关键;
-
-- 推荐系统也是帮助产品最大限度吸引用户、留存用户、增加用户粘性、提高用户转化率的银弹。
-
-- 有无数优秀的产品依靠用户可感知的推荐系统建立了良好的口碑,也有无数的公司依靠直击用户痛点的推荐系统在行业中占领了一席之地。
-
- > 可以说,谁能掌握和利用好推荐系统,谁就能在信息分发的激烈竞争中抢得先机。
- > 但与此同时,有着许多问题困扰着推荐系统的开发者,比如:庞大的数据量,复杂的模型结构,低效的分布式训练环境,波动的在离线一致性,苛刻的上线部署要求,以上种种,不胜枚举。
-
-
什么是PaddleRec?
-
-
-- 源于飞桨生态的搜索推荐模型 **一站式开箱即用工具**
-- 适合初学者,开发者,研究者的推荐系统全流程解决方案
-- 包含内容理解、匹配、召回、排序、 多任务、重排序等多个任务的完整推荐搜索算法库
-
-
- | 方向 | 模型 | 单机CPU | 单机GPU | 分布式CPU | 分布式GPU | 论文 |
- | :------: | :-----------------------------------------------------------------------: | :-----: | :-----: | :-------: | :-------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
- | 内容理解 | [Text-Classifcation](models/contentunderstanding/classification/model.py) | ✓ | ✓ | ✓ | x | [EMNLP 2014][Convolutional neural networks for sentence classication](https://www.aclweb.org/anthology/D14-1181.pdf) |
- | 内容理解 | [TagSpace](models/contentunderstanding/tagspace/model.py) | ✓ | ✓ | ✓ | x | [EMNLP 2014][TagSpace: Semantic Embeddings from Hashtags](https://www.aclweb.org/anthology/D14-1194.pdf) |
- | 匹配 | [DSSM](models/match/dssm/model.py) | ✓ | ✓ | ✓ | x | [CIKM 2013][Learning Deep Structured Semantic Models for Web Search using Clickthrough Data](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/cikm2013_DSSM_fullversion.pdf) |
- | 匹配 | [MultiView-Simnet](models/match/multiview-simnet/model.py) | ✓ | ✓ | ✓ | x | [WWW 2015][A Multi-View Deep Learning Approach for Cross Domain User Modeling in Recommendation Systems](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/frp1159-songA.pdf) |
- | 召回 | [TDM](models/treebased/tdm/model.py) | ✓ | >=1.8.0 | ✓ | >=1.8.0 | [KDD 2018][Learning Tree-based Deep Model for Recommender Systems](https://arxiv.org/pdf/1801.02294.pdf) |
- | 召回 | [fasttext](models/recall/fasttext/model.py) | ✓ | ✓ | x | x | [EACL 2017][Bag of Tricks for Efficient Text Classification](https://www.aclweb.org/anthology/E17-2068.pdf) |
- | 召回 | [Word2Vec](models/recall/word2vec/model.py) | ✓ | ✓ | ✓ | x | [NIPS 2013][Distributed Representations of Words and Phrases and their Compositionality](https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf) |
- | 召回 | [SSR](models/recall/ssr/model.py) | ✓ | ✓ | ✓ | ✓ | [SIGIR 2016][Multi-Rate Deep Learning for Temporal Recommendation](http://sonyis.me/paperpdf/spr209-song_sigir16.pdf) |
- | 召回 | [Gru4Rec](models/recall/gru4rec/model.py) | ✓ | ✓ | ✓ | ✓ | [2015][Session-based Recommendations with Recurrent Neural Networks](https://arxiv.org/abs/1511.06939) |
- | 召回 | [Youtube_dnn](models/recall/youtube_dnn/model.py) | ✓ | ✓ | ✓ | ✓ | [RecSys 2016][Deep Neural Networks for YouTube Recommendations](https://static.googleusercontent.com/media/research.google.com/zh-CN//pubs/archive/45530.pdf) |
- | 召回 | [NCF](models/recall/ncf/model.py) | ✓ | ✓ | ✓ | ✓ | [WWW 2017][Neural Collaborative Filtering](https://arxiv.org/pdf/1708.05031.pdf) |
- | 召回 | [GNN](models/recall/gnn/model.py) | ✓ | ✓ | ✓ | ✓ | [AAAI 2019][Session-based Recommendation with Graph Neural Networks](https://arxiv.org/abs/1811.00855) |
- | 排序 | [Logistic Regression](models/rank/logistic_regression/model.py) | ✓ | x | ✓ | x | / |
- | 排序 | [Dnn](models/rank/dnn/model.py) | ✓ | ✓ | ✓ | ✓ | / |
- | 排序 | [FM](models/rank/fm/model.py) | ✓ | x | ✓ | x | [IEEE Data Mining 2010][Factorization machines](https://analyticsconsultores.com.mx/wp-content/uploads/2019/03/Factorization-Machines-Steffen-Rendle-Osaka-University-2010.pdf) |
- | 排序 | [FFM](models/rank/ffm/model.py) | ✓ | x | ✓ | x | [RECSYS 2016][Field-aware Factorization Machines for CTR Prediction](https://dl.acm.org/doi/pdf/10.1145/2959100.2959134) |
- | 排序 | [FNN](models/rank/fnn/model.py) | ✓ | x | ✓ | x | [ECIR 2016][Deep Learning over Multi-field Categorical Data](https://arxiv.org/pdf/1601.02376.pdf) |
- | 排序 | [Deep Crossing](models/rank/deep_crossing/model.py) | ✓ | x | ✓ | x | [ACM 2016][Deep Crossing: Web-Scale Modeling without Manually Crafted Combinatorial Features](https://www.kdd.org/kdd2016/papers/files/adf0975-shanA.pdf) |
- | 排序 | [Pnn](models/rank/pnn/model.py) | ✓ | x | ✓ | x | [ICDM 2016][Product-based Neural Networks for User Response Prediction](https://arxiv.org/pdf/1611.00144.pdf) |
- | 排序 | [DCN](models/rank/dcn/model.py) | ✓ | x | ✓ | x | [KDD 2017][Deep & Cross Network for Ad Click Predictions](https://dl.acm.org/doi/pdf/10.1145/3124749.3124754) |
- | 排序 | [NFM](models/rank/nfm/model.py) | ✓ | x | ✓ | x | [SIGIR 2017][Neural Factorization Machines for Sparse Predictive Analytics](https://dl.acm.org/doi/pdf/10.1145/3077136.3080777) |
- | 排序 | [AFM](models/rank/afm/model.py) | ✓ | x | ✓ | x | [IJCAI 2017][Attentional Factorization Machines: Learning the Weight of Feature Interactions via Attention Networks](https://arxiv.org/pdf/1708.04617.pdf) |
- | 排序 | [DeepFM](models/rank/deepfm/model.py) | ✓ | x | ✓ | x | [IJCAI 2017][DeepFM: A Factorization-Machine based Neural Network for CTR Prediction](https://arxiv.org/pdf/1703.04247.pdf) |
- | 排序 | [xDeepFM](models/rank/xdeepfm/model.py) | ✓ | x | ✓ | x | [KDD 2018][xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systems](https://dl.acm.org/doi/pdf/10.1145/3219819.3220023) |
- | 排序 | [DIN](models/rank/din/model.py) | ✓ | x | ✓ | x | [KDD 2018][Deep Interest Network for Click-Through Rate Prediction](https://dl.acm.org/doi/pdf/10.1145/3219819.3219823) |
- | 排序 | [DIEN](models/rank/dien/model.py) | ✓ | x | ✓ | x | [AAAI 2019][Deep Interest Evolution Network for Click-Through Rate Prediction](https://www.aaai.org/ojs/index.php/AAAI/article/view/4545/4423) |
- | 排序 | [BST](models/rank/BST/model.py) | ✓ | x | ✓ | x | [DLP_KDD 2019][Behavior Sequence Transformer for E-commerce Recommendation in Alibaba](https://arxiv.org/pdf/1905.06874v1.pdf) |
- | 排序 | [AutoInt](models/rank/AutoInt/model.py) | ✓ | x | ✓ | x | [CIKM 2019][AutoInt: Automatic Feature Interaction Learning via Self-Attentive Neural Networks](https://arxiv.org/pdf/1810.11921.pdf) |
- | 排序 | [Wide&Deep](models/rank/wide_deep/model.py) | ✓ | x | ✓ | x | [DLRS 2016][Wide & Deep Learning for Recommender Systems](https://dl.acm.org/doi/pdf/10.1145/2988450.2988454) |
- | 排序 | [FGCNN](models/rank/fgcnn/model.py) | ✓ | ✓ | ✓ | ✓ | [WWW 2019][Feature Generation by Convolutional Neural Network for Click-Through Rate Prediction](https://arxiv.org/pdf/1904.04447.pdf) |
- | 排序 | [Fibinet](models/rank/fibinet/model.py) | ✓ | ✓ | ✓ | ✓ | [RecSys19][FiBiNET: Combining Feature Importance and Bilinear feature Interaction for Click-Through Rate Prediction]( https://arxiv.org/pdf/1905.09433.pdf) |
- | 排序 | [Flen](models/rank/flen/model.py) | ✓ | ✓ | ✓ | ✓ | [2019][FLEN: Leveraging Field for Scalable CTR Prediction]( https://arxiv.org/pdf/1911.04690.pdf) |
- | 多任务 | [ESMM](models/multitask/esmm/model.py) | ✓ | ✓ | ✓ | ✓ | [SIGIR 2018][Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate](https://arxiv.org/abs/1804.07931) |
- | 多任务 | [MMOE](models/multitask/mmoe/model.py) | ✓ | ✓ | ✓ | ✓ | [KDD 2018][Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts](https://dl.acm.org/doi/abs/10.1145/3219819.3220007) |
- | 多任务 | [ShareBottom](models/multitask/share-bottom/model.py) | ✓ | ✓ | ✓ | ✓ | [1998][Multitask learning](http://reports-archive.adm.cs.cmu.edu/anon/1997/CMU-CS-97-203.pdf) |
- | 重排序 | [Listwise](models/rerank/listwise/model.py) | ✓ | ✓ | ✓ | x | [2019][Sequential Evaluation and Generation Framework for Combinatorial Recommender System](https://arxiv.org/pdf/1902.00245.pdf) |
-
-
-
-
-
-快速安装
-
-### 环境要求
-* Python 2.7/ 3.5 / 3.6 / 3.7
-* PaddlePaddle >= 1.7.2
-* 操作系统: Windows/Mac/Linux
-
- > Windows下PaddleRec目前仅支持单机训练,分布式训练建议使用Linux环境
-
-### 安装命令
-
-- 安装方法一 **PIP源直接安装**
- ```bash
- python -m pip install paddle-rec
- ```
- > 该方法会默认下载安装`paddlepaddle v1.7.2 cpu版本`,若提示`PaddlePaddle`无法安装,则依照下述方法首先安装`PaddlePaddle`,再安装`PaddleRec`:
- > - 可以在[该地址](https://pypi.org/project/paddlepaddle/1.7.2/#files),下载PaddlePaddle后手动安装whl包
- > - 可以先pip安装`PaddlePaddle`,`python -m pip install paddlepaddle==1.7.2 -i https://mirror.baidu.com/pypi/simple`
- > - 其他安装问题可以在[Paddle Issue](https://github.com/PaddlePaddle/Paddle/issues)或[PaddleRec Issue](https://github.com/PaddlePaddle/PaddleRec/issues)提出,会有工程师及时解答
-
-- 安装方法二 **源码编译安装**
-
- - 安装飞桨 **注:需要用户安装版本 == 1.7.2 的飞桨**
-
- ```shell
- python -m pip install paddlepaddle==1.7.2 -i https://mirror.baidu.com/pypi/simple
- ```
-
- - 源码安装PaddleRec
-
- ```
- git clone https://github.com/PaddlePaddle/PaddleRec/
- cd PaddleRec
- python setup.py install
- ```
-
-- PaddleRec-GPU安装方法
-
- 在使用方法一或方法二完成PaddleRec安装后,需再手动安装`paddlepaddle-gpu`,并根据自身环境(Cuda/Cudnn)选择合适的版本,安装教程请查阅[飞桨-开始使用](https://www.paddlepaddle.org.cn/install/quick)
-
-
-一键启动
-
-我们以排序模型中的`dnn`模型为例介绍PaddleRec的一键启动。训练数据来源为[Criteo数据集](https://www.kaggle.com/c/criteo-display-ad-challenge/),我们从中截取了100条数据:
-
-```bash
-# 使用CPU进行单机训练
-python -m paddlerec.run -m paddlerec.models.rank.dnn
-```
-
-
-帮助文档
-
-### 项目背景
-* [推荐系统介绍](doc/rec_background.md)
-* [分布式深度学习介绍](doc/ps_background.md)
-
-### 快速开始
-* [十分钟上手PaddleRec](https://aistudio.baidu.com/aistudio/projectdetail/559336)
-
-### 入门教程
-* [数据准备](doc/slot_reader.md)
-* [模型调参](doc/model.md)
-* [启动单机训练](doc/train.md)
-* [启动分布式训练](doc/distributed_train.md)
-* [启动预测](doc/predict.md)
-* [快速部署](doc/serving.md)
-
-
-### 进阶教程
-* [自定义Reader](doc/custom_reader.md)
-* [自定义模型](doc/model_develop.md)
-* [自定义流程](doc/trainer_develop.md)
-* [yaml配置说明](doc/yaml.md)
-* [PaddleRec设计文档](doc/design.md)
-
-### Benchmark
-* [Benchmark](doc/benchmark.md)
-
-### FAQ
-* [常见问题FAQ](doc/faq.md)
-
-
-社区
-
-
-
-
-
-
-
-
-
-### 版本历史
-- 2020.06.17 - PaddleRec v0.1.0
-- 2020.06.03 - PaddleRec v0.0.2
-- 2020.05.14 - PaddleRec v0.0.1
-
-### 许可证书
-本项目的发布受[Apache 2.0 license](LICENSE)许可认证。
-
-### 联系我们
-
-如有意见、建议及使用中的BUG,欢迎在[GitHub Issue](https://github.com/PaddlePaddle/PaddleRec/issues)提交
-
-亦可通过以下方式与我们沟通交流:
-
-- QQ群号码:`861717190`
-- 微信小助手微信号:`paddlerec2020`
-
-
-PaddleRec交流QQ群 PaddleRec微信小助手
diff --git a/README_EN.md b/README_EN.md
new file mode 100644
index 0000000000000000000000000000000000000000..b409c1ad96406c30c8423eb8c693f74a2182088f
--- /dev/null
+++ b/README_EN.md
@@ -0,0 +1,189 @@
+([简体中文](./README.md)|English)
+
+
+
+
+
+
+
+
+
What is recommendation system ?
+
+
+
+
+- Recommendation system helps users quickly find useful and interesting information from massive data.
+
+- Recommendation system is also a silver bullet to attract users, retain users, increase users' stickness or conversionn.
+
+ > Who can better use the recommendation system, who can gain more advantage in the fierce competition.
+ >
+ > At the same time, there are many problems in the process of using the recommendation system, such as: huge data, complex model, inefficient distributed training, and so on.
+
+
What is PaddleRec ?
+
+
+- A quick start tool of search & recommendation algorithm based on [PaddlePaddle](https://www.paddlepaddle.org.cn/documentation/docs/en/beginners_guide/index_en.html)
+- A complete solution of recommendation system for beginners, developers and researchers.
+- Recommendation algorithm library including content-understanding, match, recall, rank, multi-task, re-rank etc.
+
+
+ | Type | Algorithm | CPU | GPU | Parameter-Server | Multi-GPU | Paper |
+ | :-------------------: | :-----------------------------------------------------------------------: | :---: | :-----: | :--------------: | :-------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | Content-Understanding | [Text-Classifcation](models/contentunderstanding/classification/model.py) | ✓ | ✓ | ✓ | x | [EMNLP 2014][Convolutional neural networks for sentence classication](https://www.aclweb.org/anthology/D14-1181.pdf) |
+ | Content-Understanding | [TagSpace](models/contentunderstanding/tagspace/model.py) | ✓ | ✓ | ✓ | x | [EMNLP 2014][TagSpace: Semantic Embeddings from Hashtags](https://www.aclweb.org/anthology/D14-1194.pdf) |
+ | Match | [DSSM](models/match/dssm/model.py) | ✓ | ✓ | ✓ | x | [CIKM 2013][Learning Deep Structured Semantic Models for Web Search using Clickthrough Data](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/cikm2013_DSSM_fullversion.pdf) |
+ | Match | [MultiView-Simnet](models/match/multiview-simnet/model.py) | ✓ | ✓ | ✓ | x | [WWW 2015][A Multi-View Deep Learning Approach for Cross Domain User Modeling in Recommendation Systems](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/frp1159-songA.pdf) |
+ | Recall | [TDM](models/treebased/tdm/model.py) | ✓ | >=1.8.0 | ✓ | >=1.8.0 | [KDD 2018][Learning Tree-based Deep Model for Recommender Systems](https://arxiv.org/pdf/1801.02294.pdf) |
+ | Recall | [fasttext](models/recall/fasttext/model.py) | ✓ | ✓ | x | x | [EACL 2017][Bag of Tricks for Efficient Text Classification](https://www.aclweb.org/anthology/E17-2068.pdf) |
+ | Recall | [Word2Vec](models/recall/word2vec/model.py) | ✓ | ✓ | ✓ | x | [NIPS 2013][Distributed Representations of Words and Phrases and their Compositionality](https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf) |
+ | Recall | [SSR](models/recall/ssr/model.py) | ✓ | ✓ | ✓ | ✓ | [SIGIR 2016][Multi-Rate Deep Learning for Temporal Recommendation](http://sonyis.me/paperpdf/spr209-song_sigir16.pdf) |
+ | Recall | [Gru4Rec](models/recall/gru4rec/model.py) | ✓ | ✓ | ✓ | ✓ | [2015][Session-based Recommendations with Recurrent Neural Networks](https://arxiv.org/abs/1511.06939) |
+ | Recall | [Youtube_dnn](models/recall/youtube_dnn/model.py) | ✓ | ✓ | ✓ | ✓ | [RecSys 2016][Deep Neural Networks for YouTube Recommendations](https://static.googleusercontent.com/media/research.google.com/zh-CN//pubs/archive/45530.pdf) |
+ | Recall | [NCF](models/recall/ncf/model.py) | ✓ | ✓ | ✓ | ✓ | [WWW 2017][Neural Collaborative Filtering](https://arxiv.org/pdf/1708.05031.pdf) |
+ | Recall | [GNN](models/recall/gnn/model.py) | ✓ | ✓ | ✓ | ✓ | [AAAI 2019][Session-based Recommendation with Graph Neural Networks](https://arxiv.org/abs/1811.00855) |
+ | Recall | [RALM](models/recall/look-alike_recall/model.py) | ✓ | ✓ | ✓ | ✓ | [KDD 2019][Real-time Attention Based Look-alike Model for Recommender System](https://arxiv.org/pdf/1906.05022.pdf) |
+ | Rank | [Logistic Regression](models/rank/logistic_regression/model.py) | ✓ | x | ✓ | x | / |
+ | Rank | [Dnn](models/rank/dnn/model.py) | ✓ | ✓ | ✓ | ✓ | / |
+ | Rank | [FM](models/rank/fm/model.py) | ✓ | x | ✓ | x | [IEEE Data Mining 2010][Factorization machines](https://analyticsconsultores.com.mx/wp-content/uploads/2019/03/Factorization-Machines-Steffen-Rendle-Osaka-University-2010.pdf) |
+ | Rank | [FFM](models/rank/ffm/model.py) | ✓ | x | ✓ | x | [RECSYS 2016][Field-aware Factorization Machines for CTR Prediction](https://dl.acm.org/doi/pdf/10.1145/2959100.2959134) |
+ | Rank | [FNN](models/rank/fnn/model.py) | ✓ | x | ✓ | x | [ECIR 2016][Deep Learning over Multi-field Categorical Data](https://arxiv.org/pdf/1601.02376.pdf) |
+ | Rank | [Deep Crossing](models/rank/deep_crossing/model.py) | ✓ | x | ✓ | x | [ACM 2016][Deep Crossing: Web-Scale Modeling without Manually Crafted Combinatorial Features](https://www.kdd.org/kdd2016/papers/files/adf0975-shanA.pdf) |
+ | Rank | [Pnn](models/rank/pnn/model.py) | ✓ | x | ✓ | x | [ICDM 2016][Product-based Neural Networks for User Response Prediction](https://arxiv.org/pdf/1611.00144.pdf) |
+ | Rank | [DCN](models/rank/dcn/model.py) | ✓ | x | ✓ | x | [KDD 2017][Deep & Cross Network for Ad Click Predictions](https://dl.acm.org/doi/pdf/10.1145/3124749.3124754) |
+ | Rank | [NFM](models/rank/nfm/model.py) | ✓ | x | ✓ | x | [SIGIR 2017][Neural Factorization Machines for Sparse Predictive Analytics](https://dl.acm.org/doi/pdf/10.1145/3077136.3080777) |
+ | Rank | [AFM](models/rank/afm/model.py) | ✓ | x | ✓ | x | [IJCAI 2017][Attentional Factorization Machines: Learning the Weight of Feature Interactions via Attention Networks](https://arxiv.org/pdf/1708.04617.pdf) |
+ | Rank | [DeepFM](models/rank/deepfm/model.py) | ✓ | x | ✓ | x | [IJCAI 2017][DeepFM: A Factorization-Machine based Neural Network for CTR Prediction](https://arxiv.org/pdf/1703.04247.pdf) |
+ | Rank | [xDeepFM](models/rank/xdeepfm/model.py) | ✓ | x | ✓ | x | [KDD 2018][xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systems](https://dl.acm.org/doi/pdf/10.1145/3219819.3220023) |
+ | Rank | [DIN](models/rank/din/model.py) | ✓ | x | ✓ | x | [KDD 2018][Deep Interest Network for Click-Through Rate Prediction](https://dl.acm.org/doi/pdf/10.1145/3219819.3219823) |
+ | Rank | [DIEN](models/rank/dien/model.py) | ✓ | x | ✓ | x | [AAAI 2019][Deep Interest Evolution Network for Click-Through Rate Prediction](https://www.aaai.org/ojs/index.php/AAAI/article/view/4545/4423) |
+ | Rank | [BST](models/rank/BST/model.py) | ✓ | x | ✓ | x | [DLP-KDD 2019][Behavior Sequence Transformer for E-commerce Recommendation in Alibaba](https://arxiv.org/pdf/1905.06874v1.pdf) |
+ | Rank | [AutoInt](models/rank/AutoInt/model.py) | ✓ | x | ✓ | x | [CIKM 2019][AutoInt: Automatic Feature Interaction Learning via Self-Attentive Neural Networks](https://arxiv.org/pdf/1810.11921.pdf) |
+ | Rank | [Wide&Deep](models/rank/wide_deep/model.py) | ✓ | x | ✓ | x | [DLRS 2016][Wide & Deep Learning for Recommender Systems](https://dl.acm.org/doi/pdf/10.1145/2988450.2988454) |
+ | Rank | [FGCNN](models/rank/fgcnn/model.py) | ✓ | ✓ | ✓ | ✓ | [WWW 2019][Feature Generation by Convolutional Neural Network for Click-Through Rate Prediction](https://arxiv.org/pdf/1904.04447.pdf) |
+ | Rank | [Fibinet](models/rank/fibinet/model.py) | ✓ | ✓ | ✓ | ✓ | [RecSys19][FiBiNET: Combining Feature Importance and Bilinear feature Interaction for Click-Through Rate Prediction]( https://arxiv.org/pdf/1905.09433.pdf) |
+ | Rank | [Flen](models/rank/flen/model.py) | ✓ | ✓ | ✓ | ✓ | [2019][FLEN: Leveraging Field for Scalable CTR Prediction]( https://arxiv.org/pdf/1911.04690.pdf) |
+ | Multi-Task | [ESMM](models/multitask/esmm/model.py) | ✓ | ✓ | ✓ | ✓ | [SIGIR 2018][Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate](https://arxiv.org/abs/1804.07931) |
+ | Multi-Task | [MMOE](models/multitask/mmoe/model.py) | ✓ | ✓ | ✓ | ✓ | [KDD 2018][Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts](https://dl.acm.org/doi/abs/10.1145/3219819.3220007) |
+ | Multi-Task | [ShareBottom](models/multitask/share-bottom/model.py) | ✓ | ✓ | ✓ | ✓ | [1998][Multitask learning](http://reports-archive.adm.cs.cmu.edu/anon/1997/CMU-CS-97-203.pdf) |
+ | Re-Rank | [Listwise](models/rerank/listwise/model.py) | ✓ | ✓ | ✓ | x | [2019][Sequential Evaluation and Generation Framework for Combinatorial Recommender System](https://arxiv.org/pdf/1902.00245.pdf) |
+
+
+
+
+
+Getting Started
+
+### Environmental requirements
+* Python 2.7/ 3.5 / 3.6 / 3.7
+* PaddlePaddle >= 1.7.2
+* operating system: Windows/Mac/Linux
+
+ > Linux is recommended for distributed training
+
+### Installation
+
+1. **Install by pip**
+ ```bash
+ python -m pip install paddle-rec
+ ```
+ > This method will download and install `paddlepaddle-v1.7.2-cpu`. If `PaddlePaddle` can not be installed automatically,You need to install `PaddlePaddle` manually,and then install `PaddleRec` again:
+ > - Download [PaddlePaddle](https://pypi.org/project/paddlepaddle/1.7.2/#files) and install by pip.
+ > - Install `PaddlePaddle` by pip,`python -m pip install paddlepaddle==1.7.2 -i https://mirror.baidu.com/pypi/simple`
+ > - Other installation problems can be raised in [Paddle Issue](https://github.com/PaddlePaddle/Paddle/issues) or [PaddleRec Issue](https://github.com/PaddlePaddle/PaddleRec/issues)
+
+2. **Install by source code**
+
+ - Install PaddlePaddle
+
+ ```shell
+ python -m pip install paddlepaddle==1.7.2 -i https://mirror.baidu.com/pypi/simple
+ ```
+
+ - Install PaddleRec by source code
+
+ ```
+ git clone https://github.com/PaddlePaddle/PaddleRec/
+ cd PaddleRec
+ python setup.py install
+ ```
+
+- Install PaddleRec-GPU
+
+ After installing `PaddleRec`,please install the appropriate version of `paddlepaddle-gpu` according to your environment (CUDA / cudnn),refer to the installation tutorial [Installation Manuals](https://www.paddlepaddle.org.cn/documentation/docs/en/install/index_en.html)
+
+
+Quick Start
+
+We take the `dnn` algorithm as an example to get start of `PaddleRec`, and we take 100 pieces of training data from [Criteo Dataset](https://www.kaggle.com/c/criteo-display-ad-challenge/):
+
+```bash
+# Training with cpu
+git clone https://github.com/PaddlePaddle/PaddleRec.git paddle-rec
+cd paddle-rec
+
+python -m paddlerec.run -m models/rank/dnn/config.yaml
+```
+
+
+Documentation
+
+### Background
+* [Recommendation System](doc/rec_background.md)
+* [Distributed deep learning](doc/ps_background.md)
+
+### Introductory Project
+* [Get start of PaddleRec in ten minutes](https://aistudio.baidu.com/aistudio/projectdetail/559336)
+
+### Introductory tutorial
+* [Data](doc/slot_reader.md)
+* [Model](doc/model.md)
+* [Loacl Train](doc/train.md)
+* [Distributed Train](doc/distributed_train.md)
+* [Predict](doc/predict.md)
+* [Serving](doc/serving.md)
+
+
+### Advanced tutorial
+* [Custom Reader](doc/custom_reader.md)
+* [Custom Model](doc/model_develop.md)
+* [Custom Training Process](doc/trainer_develop.md)
+* [Configuration description of yaml](doc/yaml.md)
+* [Design document of PaddleRec](doc/design.md)
+
+### Benchmark
+* [Benchmark](doc/benchmark.md)
+
+### FAQ
+* [Common Problem FAQ](doc/faq.md)
+
+
+Community
+
+
+
+
+
+
+
+
+
+### Version history
+- 2020.06.17 - PaddleRec v0.1.0
+- 2020.06.03 - PaddleRec v0.0.2
+- 2020.05.14 - PaddleRec v0.0.1
+
+### License
+[Apache 2.0 license](LICENSE)
+
+### Contact us
+
+For any feedback, please propose a [GitHub Issue](https://github.com/PaddlePaddle/PaddleRec/issues)
+
+You can also communicate with us in the following ways:
+
+- QQ group id:`861717190`
+- Wechat account:`paddlerec2020`
+
+
+PaddleRec QQ Group PaddleRec Wechat account
diff --git a/core/engine/cluster/cloud/before_hook_cpu.sh.template b/core/engine/cluster/cloud/before_hook_cpu.sh.template
index 07e5d7337d9171518187ff96c9de9bcb5e734df4..d0bd67b2fbe60221ad51e99073d097675286eac7 100644
--- a/core/engine/cluster/cloud/before_hook_cpu.sh.template
+++ b/core/engine/cluster/cloud/before_hook_cpu.sh.template
@@ -1,6 +1,6 @@
echo "Run before_hook.sh ..."
-wget https://paddlerec.bj.bcebos.com/whl/PaddleRec.tar.gz
+wget https://paddlerec.bj.bcebos.com/whl/PaddleRec.tar.gz --no-check-certificate
tar -xf PaddleRec.tar.gz
@@ -10,6 +10,6 @@ python setup.py install
pip uninstall -y paddlepaddle
-pip install paddlepaddle-gpu==<$ PADDLEPADDLE_VERSION $> --index-url=http://pip.baidu.com/pypi/simple --trusted-host pip.baidu.com
+pip install paddlepaddle==<$ PADDLEPADDLE_VERSION $> --index-url=http://pip.baidu.com/pypi/simple --trusted-host pip.baidu.com
echo "End before_hook.sh ..."
diff --git a/core/engine/cluster/cloud/before_hook_gpu.sh.template b/core/engine/cluster/cloud/before_hook_gpu.sh.template
index e1bbde468b900262f28f53e8895f5da219aa140d..1a9d5e189870e84670e60571dfbeadd48e1245b0 100644
--- a/core/engine/cluster/cloud/before_hook_gpu.sh.template
+++ b/core/engine/cluster/cloud/before_hook_gpu.sh.template
@@ -1,6 +1,6 @@
echo "Run before_hook.sh ..."
-wget https://paddlerec.bj.bcebos.com/whl/PaddleRec.tar.gz
+wget https://paddlerec.bj.bcebos.com/whl/PaddleRec.tar.gz --no-check-certificate
tar -xf PaddleRec.tar.gz
diff --git a/core/engine/cluster/cloud/cluster.sh b/core/engine/cluster/cloud/cluster.sh
index 35ba5657f36cff46b41c06639e43676af44f264a..399a21e78aa2eba2489c8aa0b4f2214328bd0a50 100644
--- a/core/engine/cluster/cloud/cluster.sh
+++ b/core/engine/cluster/cloud/cluster.sh
@@ -39,7 +39,12 @@ function _before_submit() {
elif [ ${DISTRIBUTE_MODE} == "COLLECTIVE_GPU_K8S" ]; then
_gen_gpu_before_hook
_gen_k8s_config
- _gen_k8s_job
+ _gen_k8s_gpu_job
+ _gen_end_hook
+ elif [ ${DISTRIBUTE_MODE} == "PS_CPU_K8S" ]; then
+ _gen_cpu_before_hook
+ _gen_k8s_config
+ _gen_k8s_cpu_job
_gen_end_hook
fi
@@ -54,6 +59,7 @@ function _gen_mpi_config() {
-e "s#<$ OUTPUT_PATH $>#$OUTPUT_PATH#g" \
-e "s#<$ THIRDPARTY_PATH $>#$THIRDPARTY_PATH#g" \
-e "s#<$ CPU_NUM $>#$max_thread_num#g" \
+ -e "s#<$ USE_PYTHON3 $>#$USE_PYTHON3#g" \
-e "s#<$ FLAGS_communicator_is_sgd_optimizer $>#$FLAGS_communicator_is_sgd_optimizer#g" \
-e "s#<$ FLAGS_communicator_send_queue_size $>#$FLAGS_communicator_send_queue_size#g" \
-e "s#<$ FLAGS_communicator_thread_pool_size $>#$FLAGS_communicator_thread_pool_size#g" \
@@ -71,6 +77,7 @@ function _gen_k8s_config() {
-e "s#<$ AFS_REMOTE_MOUNT_POINT $>#$AFS_REMOTE_MOUNT_POINT#g" \
-e "s#<$ OUTPUT_PATH $>#$OUTPUT_PATH#g" \
-e "s#<$ CPU_NUM $>#$max_thread_num#g" \
+ -e "s#<$ USE_PYTHON3 $>#$USE_PYTHON3#g" \
-e "s#<$ FLAGS_communicator_is_sgd_optimizer $>#$FLAGS_communicator_is_sgd_optimizer#g" \
-e "s#<$ FLAGS_communicator_send_queue_size $>#$FLAGS_communicator_send_queue_size#g" \
-e "s#<$ FLAGS_communicator_thread_pool_size $>#$FLAGS_communicator_thread_pool_size#g" \
@@ -101,6 +108,7 @@ function _gen_end_hook() {
function _gen_mpi_job() {
echo "gen mpi_job.sh"
sed -e "s#<$ GROUP_NAME $>#$GROUP_NAME#g" \
+ -e "s#<$ JOB_NAME $>#$OLD_JOB_NAME#g" \
-e "s#<$ AK $>#$AK#g" \
-e "s#<$ SK $>#$SK#g" \
-e "s#<$ MPI_PRIORITY $>#$PRIORITY#g" \
@@ -109,18 +117,34 @@ function _gen_mpi_job() {
${abs_dir}/cloud/mpi_job.sh.template >${PWD}/job.sh
}
-function _gen_k8s_job() {
+function _gen_k8s_gpu_job() {
echo "gen k8s_job.sh"
sed -e "s#<$ GROUP_NAME $>#$GROUP_NAME#g" \
+ -e "s#<$ JOB_NAME $>#$OLD_JOB_NAME#g" \
-e "s#<$ AK $>#$AK#g" \
-e "s#<$ SK $>#$SK#g" \
-e "s#<$ K8S_PRIORITY $>#$PRIORITY#g" \
-e "s#<$ K8S_TRAINERS $>#$K8S_TRAINERS#g" \
+ -e "s#<$ K8S_CPU_CORES $>#$K8S_CPU_CORES#g" \
-e "s#<$ K8S_GPU_CARD $>#$K8S_GPU_CARD#g" \
-e "s#<$ START_CMD $>#$START_CMD#g" \
${abs_dir}/cloud/k8s_job.sh.template >${PWD}/job.sh
}
+function _gen_k8s_cpu_job() {
+ echo "gen k8s_job.sh"
+ sed -e "s#<$ GROUP_NAME $>#$GROUP_NAME#g" \
+ -e "s#<$ JOB_NAME $>#$OLD_JOB_NAME#g" \
+ -e "s#<$ AK $>#$AK#g" \
+ -e "s#<$ SK $>#$SK#g" \
+ -e "s#<$ K8S_PRIORITY $>#$PRIORITY#g" \
+ -e "s#<$ K8S_TRAINERS $>#$K8S_TRAINERS#g" \
+ -e "s#<$ K8S_PS_NUM $>#$K8S_PS_NUM#g" \
+ -e "s#<$ K8S_PS_CORES $>#$K8S_PS_CORES#g" \
+ -e "s#<$ K8S_CPU_CORES $>#$K8S_CPU_CORES#g" \
+ -e "s#<$ START_CMD $>#$START_CMD#g" \
+ ${abs_dir}/cloud/k8s_cpu_job.sh.template >${PWD}/job.sh
+}
#-----------------------------------------------------------------------------------------------------------------
@@ -145,6 +169,7 @@ function _submit() {
function package_hook() {
cur_time=`date +"%Y%m%d%H%M"`
new_job_name="${JOB_NAME}_${cur_time}"
+ export OLD_JOB_NAME=${JOB_NAME}
export JOB_NAME=${new_job_name}
export job_file_path="${PWD}/${new_job_name}"
mkdir ${job_file_path}
diff --git a/core/engine/cluster/cloud/k8s_config.ini.template b/core/engine/cluster/cloud/k8s_config.ini.template
index 904bfbc5e1453f90ec1163d1681d554b52dae45f..471bd1a0dd2931591b0d6eda7f87cc25458b3f80 100644
--- a/core/engine/cluster/cloud/k8s_config.ini.template
+++ b/core/engine/cluster/cloud/k8s_config.ini.template
@@ -19,6 +19,8 @@ afs_local_mount_point="/root/paddlejob/workspace/env_run/afs/"
# 新k8s afs挂载帮助文档: http://wiki.baidu.com/pages/viewpage.action?pageId=906443193
PADDLE_PADDLEREC_ROLE=WORKER
+PADDLEREC_CLUSTER_TYPE=K8S
+use_python3=<$ USE_PYTHON3 $>
CPU_NUM=<$ CPU_NUM $>
GLOG_v=0
diff --git a/core/engine/cluster/cloud/k8s_cpu_job.sh.template b/core/engine/cluster/cloud/k8s_cpu_job.sh.template
new file mode 100644
index 0000000000000000000000000000000000000000..2889cd1d55008f22b7e9fb854019f996a4746f8c
--- /dev/null
+++ b/core/engine/cluster/cloud/k8s_cpu_job.sh.template
@@ -0,0 +1,40 @@
+#!/bin/bash
+###############################################################
+## 注意-- 注意--注意 ##
+## K8S PS-CPU多机作业作业示例 ##
+###############################################################
+job_name=<$ JOB_NAME $>
+
+# 作业参数
+group_name="<$ GROUP_NAME $>"
+job_version="paddle-fluid-v1.7.1"
+start_cmd="<$ START_CMD $>"
+wall_time="2000:00:00"
+
+k8s_priority=<$ K8S_PRIORITY $>
+k8s_trainers=<$ K8S_TRAINERS $>
+k8s_cpu_cores=<$ K8S_CPU_CORES $>
+k8s_ps_num=<$ K8S_PS_NUM $>
+k8s_ps_cores=<$ K8S_PS_CORES $>
+
+# 你的ak/sk(可在paddlecloud web页面【个人中心】处获取)
+ak=<$ AK $>
+sk=<$ SK $>
+
+paddlecloud job --ak ${ak} --sk ${sk} \
+ train --job-name ${job_name} \
+ --group-name ${group_name} \
+ --job-conf config.ini \
+ --start-cmd "${start_cmd}" \
+ --files ./* \
+ --job-version ${job_version} \
+ --k8s-priority ${k8s_priority} \
+ --wall-time ${wall_time} \
+ --k8s-trainers ${k8s_trainers} \
+ --k8s-cpu-cores ${k8s_cpu_cores} \
+ --k8s-ps-num ${k8s_ps_num} \
+ --k8s-ps-cores ${k8s_ps_cores} \
+ --is-standalone 0 \
+ --distribute-job-type "PSERVER" \
+ --json
+
\ No newline at end of file
diff --git a/core/engine/cluster/cloud/k8s_job.sh.template b/core/engine/cluster/cloud/k8s_job.sh.template
index 5c2ebdcd62ef4ca46dafc57db95ede9fcfd13ab3..8314e9efd0ec349bb00e28605386e34dfc601102 100644
--- a/core/engine/cluster/cloud/k8s_job.sh.template
+++ b/core/engine/cluster/cloud/k8s_job.sh.template
@@ -3,18 +3,30 @@
## 注意-- 注意--注意 ##
## K8S NCCL2多机作业作业示例 ##
###############################################################
-job_name=${JOB_NAME}
+job_name=<$ JOB_NAME $>
# 作业参数
group_name="<$ GROUP_NAME $>"
job_version="paddle-fluid-v1.7.1"
start_cmd="<$ START_CMD $>"
-wall_time="10:00:00"
+wall_time="2000:00:00"
k8s_priority=<$ K8S_PRIORITY $>
k8s_trainers=<$ K8S_TRAINERS $>
+k8s_cpu_cores=<$ K8S_CPU_CORES $>
k8s_gpu_cards=<$ K8S_GPU_CARD $>
+is_stand_alone=0
+nccl="--distribute-job-type "NCCL2""
+if [ ${k8s_trainers} == 1 ];then
+ is_stand_alone=1
+ nccl="--job-remark single-trainer"
+ if [ ${k8s_gpu_cards} == 1];then
+ nccl="--job-remark single-gpu"
+ echo "Attention: Use single GPU card for PaddleRec distributed training, please set runner class from 'cluster_train' to 'train' in config.yaml."
+ fi
+fi
+
# 你的ak/sk(可在paddlecloud web页面【个人中心】处获取)
ak=<$ AK $>
sk=<$ SK $>
@@ -27,9 +39,11 @@ paddlecloud job --ak ${ak} --sk ${sk} \
--files ./* \
--job-version ${job_version} \
--k8s-trainers ${k8s_trainers} \
+ --k8s-cpu-cores ${k8s_cpu_cores} \
--k8s-gpu-cards ${k8s_gpu_cards} \
--k8s-priority ${k8s_priority} \
--wall-time ${wall_time} \
- --is-standalone 0 \
- --distribute-job-type "NCCL2" \
- --json
\ No newline at end of file
+ --is-standalone ${is_stand_alone} \
+ --json \
+ ${nccl}
+
\ No newline at end of file
diff --git a/core/engine/cluster/cloud/mpi_config.ini.template b/core/engine/cluster/cloud/mpi_config.ini.template
index 8312d46a01449b3d6eac322b098d5b029bb67f86..a3ac22f0c7fc09e9b6eda44306972dd296d19ab7 100644
--- a/core/engine/cluster/cloud/mpi_config.ini.template
+++ b/core/engine/cluster/cloud/mpi_config.ini.template
@@ -17,6 +17,8 @@ output_path=<$ OUTPUT_PATH $>
thirdparty_path=<$ THIRDPARTY_PATH $>
PADDLE_PADDLEREC_ROLE=WORKER
+PADDLEREC_CLUSTER_TYPE=MPI
+use_python3=<$ USE_PYTHON3 $>
CPU_NUM=<$ CPU_NUM $>
GLOG_v=0
diff --git a/core/engine/cluster/cloud/mpi_job.sh.template b/core/engine/cluster/cloud/mpi_job.sh.template
index 84fafaffaa9f6ccc06578d673144c0d63069e13b..b3a3c20a02094cca68c96f527bf29d3150996228 100644
--- a/core/engine/cluster/cloud/mpi_job.sh.template
+++ b/core/engine/cluster/cloud/mpi_job.sh.template
@@ -3,13 +3,13 @@
## 注意--注意--注意 ##
## MPI 类型作业演示 ##
###############################################################
-job_name=${JOB_NAME}
+job_name=<$ JOB_NAME $>
# 作业参数
group_name=<$ GROUP_NAME $>
job_version="paddle-fluid-v1.7.1"
start_cmd="<$ START_CMD $>"
-wall_time="2:00:00"
+wall_time="2000:00:00"
# 你的ak/sk(可在paddlecloud web页面【个人中心】处获取)
ak=<$ AK $>
diff --git a/core/engine/cluster/cluster.py b/core/engine/cluster/cluster.py
index 4fe7529f9664a4e9a78c63dbe6c5c18dfe59f141..a64e99e38b2df3033e480706bedd02eadea1dc90 100644
--- a/core/engine/cluster/cluster.py
+++ b/core/engine/cluster/cluster.py
@@ -67,10 +67,10 @@ class ClusterEngine(Engine):
@staticmethod
def workspace_replace():
- workspace = envs.get_runtime_environ("workspace")
+ remote_workspace = envs.get_runtime_environ("remote_workspace")
for k, v in os.environ.items():
- v = v.replace("{workspace}", workspace)
+ v = v.replace("{workspace}", remote_workspace)
os.environ[k] = str(v)
def run(self):
@@ -98,14 +98,12 @@ class ClusterEngine(Engine):
cluster_env_check_tool = PaddleCloudMpiEnv()
else:
raise ValueError(
- "Paddlecloud with Mpi don't support GPU training, check your config"
+ "Paddlecloud with Mpi don't support GPU training, check your config.yaml & backend.yaml"
)
elif cluster_type.upper() == "K8S":
if fleet_mode == "PS":
if device == "CPU":
- raise ValueError(
- "PS-CPU on paddlecloud is not supported at this time, comming soon"
- )
+ cluster_env_check_tool = CloudPsCpuEnv()
elif device == "GPU":
raise ValueError(
"PS-GPU on paddlecloud is not supported at this time, comming soon"
@@ -115,7 +113,7 @@ class ClusterEngine(Engine):
cluster_env_check_tool = CloudCollectiveEnv()
elif device == "CPU":
raise ValueError(
- "Unexpected config -> device: CPU with fleet_mode: Collective, check your config"
+ "Unexpected config -> device: CPU with fleet_mode: Collective, check your config.yaml"
)
else:
raise ValueError("cluster_type {} error, must in MPI/K8S".format(
@@ -161,23 +159,30 @@ class ClusterEnvBase(object):
self.cluster_env["PADDLE_VERSION"] = self.backend_env.get(
"config.paddle_version", "1.7.2")
+ # python_version
+ self.cluster_env["USE_PYTHON3"] = self.backend_env.get(
+ "config.use_python3", "0")
+
# communicator
+ max_thread_num = int(envs.get_runtime_environ("max_thread_num"))
self.cluster_env[
"FLAGS_communicator_is_sgd_optimizer"] = self.backend_env.get(
"config.communicator.FLAGS_communicator_is_sgd_optimizer", 0)
self.cluster_env[
"FLAGS_communicator_send_queue_size"] = self.backend_env.get(
- "config.communicator.FLAGS_communicator_send_queue_size", 5)
+ "config.communicator.FLAGS_communicator_send_queue_size",
+ max_thread_num)
self.cluster_env[
"FLAGS_communicator_thread_pool_size"] = self.backend_env.get(
"config.communicator.FLAGS_communicator_thread_pool_size", 32)
self.cluster_env[
"FLAGS_communicator_max_merge_var_num"] = self.backend_env.get(
- "config.communicator.FLAGS_communicator_max_merge_var_num", 5)
+ "config.communicator.FLAGS_communicator_max_merge_var_num",
+ max_thread_num)
self.cluster_env[
"FLAGS_communicator_max_send_grad_num_before_recv"] = self.backend_env.get(
"config.communicator.FLAGS_communicator_max_send_grad_num_before_recv",
- 5)
+ max_thread_num)
self.cluster_env["FLAGS_communicator_fake_rpc"] = self.backend_env.get(
"config.communicator.FLAGS_communicator_fake_rpc", 0)
self.cluster_env["FLAGS_rpc_retry_times"] = self.backend_env.get(
@@ -234,7 +239,7 @@ class PaddleCloudMpiEnv(ClusterEnvBase):
"config.train_data_path", "")
if self.cluster_env["TRAIN_DATA_PATH"] == "":
raise ValueError(
- "No -- TRAIN_DATA_PATH -- found in your backend.yaml, please check."
+ "No -- TRAIN_DATA_PATH -- found in your backend.yaml, please add train_data_path in your backend yaml."
)
# test_data_path
self.cluster_env["TEST_DATA_PATH"] = self.backend_env.get(
@@ -274,7 +279,7 @@ class PaddleCloudK8sEnv(ClusterEnvBase):
category=UserWarning,
stacklevel=2)
warnings.warn(
- "The remote mount point will be mounted to the ./afs/",
+ "The remote afs path will be mounted to the ./afs/",
category=UserWarning,
stacklevel=2)
@@ -293,3 +298,21 @@ class CloudCollectiveEnv(PaddleCloudK8sEnv):
"submit.k8s_gpu_card", 1)
self.cluster_env["K8S_CPU_CORES"] = self.backend_env.get(
"submit.k8s_cpu_cores", 1)
+
+
+class CloudPsCpuEnv(PaddleCloudK8sEnv):
+ def __init__(self):
+ super(CloudPsCpuEnv, self).__init__()
+
+ def env_check(self):
+ super(CloudPsCpuEnv, self).env_check()
+
+ self.cluster_env["DISTRIBUTE_MODE"] = "PS_CPU_K8S"
+ self.cluster_env["K8S_TRAINERS"] = self.backend_env.get(
+ "submit.k8s_trainers", 1)
+ self.cluster_env["K8S_CPU_CORES"] = self.backend_env.get(
+ "submit.k8s_cpu_cores", 2)
+ self.cluster_env["K8S_PS_NUM"] = self.backend_env.get(
+ "submit.k8s_ps_num", 1)
+ self.cluster_env["K8S_PS_CORES"] = self.backend_env.get(
+ "submit.k8s_ps_cores", 2)
diff --git a/core/factory.py b/core/factory.py
index 9430c88283800e69db7043aa141b6f735212c79f..95e0e7778141ad76d1166205213bccdaae67aff7 100755
--- a/core/factory.py
+++ b/core/factory.py
@@ -22,6 +22,19 @@ trainers = {}
def trainer_registry():
+ trainers["SingleTrainer"] = os.path.join(trainer_abs, "single_trainer.py")
+ trainers["ClusterTrainer"] = os.path.join(trainer_abs,
+ "cluster_trainer.py")
+ trainers["CtrCodingTrainer"] = os.path.join(trainer_abs,
+ "ctr_coding_trainer.py")
+ trainers["CtrModulTrainer"] = os.path.join(trainer_abs,
+ "ctr_modul_trainer.py")
+ trainers["TDMSingleTrainer"] = os.path.join(trainer_abs,
+ "tdm_single_trainer.py")
+ trainers["TDMClusterTrainer"] = os.path.join(trainer_abs,
+ "tdm_cluster_trainer.py")
+ trainers["OnlineLearningTrainer"] = os.path.join(
+ trainer_abs, "online_learning_trainer.py")
# Definition of procedure execution process
trainers["CtrCodingTrainer"] = os.path.join(trainer_abs,
"ctr_coding_trainer.py")
diff --git a/core/metric.py b/core/metric.py
index d9968fa40167b6ca728b0c1046fca5e70ef427a7..12a9ddf79d5a0821f0e6c6d9195bf51a63ebd6fb 100755
--- a/core/metric.py
+++ b/core/metric.py
@@ -23,34 +23,58 @@ class Metric(object):
__metaclass__ = abc.ABCMeta
def __init__(self, config):
- """ """
+ """R
+ """
pass
- def clear(self, scope=None, **kwargs):
- """
- clear current value
- Args:
- scope: value container
- params: extend varilable for clear
+ def clear(self, scope=None):
+ """R
"""
if scope is None:
scope = fluid.global_scope()
place = fluid.CPUPlace()
- for (varname, dtype) in self._need_clear_list:
- if scope.find_var(varname) is None:
+ for key in self._global_metric_state_vars:
+ varname, dtype = self._global_metric_state_vars[key]
+ var = scope.find_var(varname)
+ if not var:
continue
- var = scope.var(varname).get_tensor()
+ var = var.get_tensor()
data_array = np.zeros(var._get_dims()).astype(dtype)
var.set(data_array, place)
- def calculate(self, scope, params):
+ def _get_global_metric_state(self, fleet, scope, metric_name, mode="sum"):
+ """R
"""
- calculate result
- Args:
- scope: value container
- params: extend varilable for clear
+ var = scope.find_var(metric_name)
+ if not var:
+ return None
+ input = np.array(var.get_tensor())
+ if fleet is None:
+ return input
+ fleet._role_maker._barrier_worker()
+ old_shape = np.array(input.shape)
+ input = input.reshape(-1)
+ output = np.copy(input) * 0
+ fleet._role_maker._all_reduce(input, output, mode=mode)
+ output = output.reshape(old_shape)
+ return output
+
+ def calc_global_metrics(self, fleet, scope=None):
+ """R
"""
+ if scope is None:
+ scope = fluid.global_scope()
+
+ global_metrics = dict()
+ for key in self._global_metric_state_vars:
+ varname, dtype = self._global_metric_state_vars[key]
+ global_metrics[key] = self._get_global_metric_state(fleet, scope,
+ varname)
+
+ return self._calculate(global_metrics)
+
+ def _calculate(self, global_metrics):
pass
@abc.abstractmethod
diff --git a/core/metrics/__init__.py b/core/metrics/__init__.py
index 23fd64e7ac281f4521ce9b6ea3cb7d6d465e5a17..2820518c02ebffd1c0c4e847bb30b14cf0a689f9 100755
--- a/core/metrics/__init__.py
+++ b/core/metrics/__init__.py
@@ -12,6 +12,9 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-from precision import Precision
+from .recall_k import RecallK
+from .pairwise_pn import PosNegRatio
+from .precision_recall import PrecisionRecall
+from .auc import AUC
-__all__ = ['Precision']
+__all__ = ['RecallK', 'PosNegRatio', 'AUC', 'PrecisionRecall']
diff --git a/core/metrics/auc_metrics.py b/core/metrics/auc.py
similarity index 50%
rename from core/metrics/auc_metrics.py
rename to core/metrics/auc.py
index 431411f343d2b7d15d7f6620ebbcd0ecec6a32d4..672a1ffa84291782963d32bd58875170253e41d1 100755
--- a/core/metrics/auc_metrics.py
+++ b/core/metrics/auc.py
@@ -18,102 +18,60 @@ import numpy as np
import paddle.fluid as fluid
from paddlerec.core.metric import Metric
+from paddle.fluid.layers.tensor import Variable
-class AUCMetric(Metric):
+class AUC(Metric):
"""
Metric For Fluid Model
"""
- def __init__(self, config, fleet):
+ def __init__(self,
+ input,
+ label,
+ curve='ROC',
+ num_thresholds=2**12 - 1,
+ topk=1,
+ slide_steps=1):
""" """
- self.config = config
- self.fleet = fleet
-
- def clear(self, scope, params):
- """
- Clear current metric value, usually set to zero
- Args:
- scope : paddle runtime var container
- params(dict) :
- label : a group name for metric
- metric_dict : current metric_items in group
- Return:
- None
- """
- self._label = params['label']
- self._metric_dict = params['metric_dict']
- self._result = {}
- place = fluid.CPUPlace()
- for metric_name in self._metric_dict:
- metric_config = self._metric_dict[metric_name]
- if scope.find_var(metric_config['var'].name) is None:
- continue
- metric_var = scope.var(metric_config['var'].name).get_tensor()
- data_type = 'float32'
- if 'data_type' in metric_config:
- data_type = metric_config['data_type']
- data_array = np.zeros(metric_var._get_dims()).astype(data_type)
- metric_var.set(data_array, place)
-
- def get_metric(self, scope, metric_name):
- """
- reduce metric named metric_name from all worker
- Return:
- metric reduce result
- """
- metric = np.array(scope.find_var(metric_name).get_tensor())
- old_metric_shape = np.array(metric.shape)
- metric = metric.reshape(-1)
- global_metric = np.copy(metric) * 0
- self.fleet._role_maker.all_reduce_worker(metric, global_metric)
- global_metric = global_metric.reshape(old_metric_shape)
- return global_metric[0]
-
- def get_global_metrics(self, scope, metric_dict):
- """
- reduce all metric in metric_dict from all worker
- Return:
- dict : {matric_name : metric_result}
- """
- self.fleet._role_maker._barrier_worker()
- result = {}
- for metric_name in metric_dict:
- metric_item = metric_dict[metric_name]
- if scope.find_var(metric_item['var'].name) is None:
- result[metric_name] = None
- continue
- result[metric_name] = self.get_metric(scope,
- metric_item['var'].name)
- return result
-
- def calculate_auc(self, global_pos, global_neg):
- """R
- """
- num_bucket = len(global_pos)
- area = 0.0
- pos = 0.0
- neg = 0.0
- new_pos = 0.0
- new_neg = 0.0
- total_ins_num = 0
- for i in range(num_bucket):
- index = num_bucket - 1 - i
- new_pos = pos + global_pos[index]
- total_ins_num += global_pos[index]
- new_neg = neg + global_neg[index]
- total_ins_num += global_neg[index]
- area += (new_neg - neg) * (pos + new_pos) / 2
- pos = new_pos
- neg = new_neg
- auc_value = None
- if pos * neg == 0 or total_ins_num == 0:
- auc_value = 0.5
- else:
- auc_value = area / (pos * neg)
- return auc_value
-
- def calculate_bucket_error(self, global_pos, global_neg):
+ if not isinstance(input, Variable):
+ raise ValueError("input must be Variable, but received %s" %
+ type(input))
+ if not isinstance(label, Variable):
+ raise ValueError("label must be Variable, but received %s" %
+ type(label))
+
+ auc_out, batch_auc_out, [
+ batch_stat_pos, batch_stat_neg, stat_pos, stat_neg
+ ] = fluid.layers.auc(input,
+ label,
+ curve=curve,
+ num_thresholds=num_thresholds,
+ topk=topk,
+ slide_steps=slide_steps)
+
+ prob = fluid.layers.slice(input, axes=[1], starts=[1], ends=[2])
+ label_cast = fluid.layers.cast(label, dtype="float32")
+ label_cast.stop_gradient = True
+ sqrerr, abserr, prob, q, pos, total = \
+ fluid.contrib.layers.ctr_metric_bundle(prob, label_cast)
+
+ self._global_metric_state_vars = dict()
+ self._global_metric_state_vars['stat_pos'] = (stat_pos.name, "float32")
+ self._global_metric_state_vars['stat_neg'] = (stat_neg.name, "float32")
+ self._global_metric_state_vars['total_ins_num'] = (total.name,
+ "float32")
+ self._global_metric_state_vars['pos_ins_num'] = (pos.name, "float32")
+ self._global_metric_state_vars['q'] = (q.name, "float32")
+ self._global_metric_state_vars['prob'] = (prob.name, "float32")
+ self._global_metric_state_vars['abserr'] = (abserr.name, "float32")
+ self._global_metric_state_vars['sqrerr'] = (sqrerr.name, "float32")
+
+ self.metrics = dict()
+ self.metrics["AUC"] = auc_out
+ self.metrics["BATCH_AUC"] = batch_auc_out
+
+ def _calculate_bucket_error(self, global_pos, global_neg):
"""R
"""
num_bucket = len(global_pos)
@@ -161,56 +119,69 @@ class AUCMetric(Metric):
bucket_error = error_sum / error_count if error_count > 0 else 0.0
return bucket_error
- def calculate(self, scope, params):
- """ """
- self._label = params['label']
- self._metric_dict = params['metric_dict']
- self.fleet._role_maker._barrier_worker()
- result = self.get_global_metrics(scope, self._metric_dict)
+ def _calculate_auc(self, global_pos, global_neg):
+ """R
+ """
+ num_bucket = len(global_pos)
+ area = 0.0
+ pos = 0.0
+ neg = 0.0
+ new_pos = 0.0
+ new_neg = 0.0
+ total_ins_num = 0
+ for i in range(num_bucket):
+ index = num_bucket - 1 - i
+ new_pos = pos + global_pos[index]
+ total_ins_num += global_pos[index]
+ new_neg = neg + global_neg[index]
+ total_ins_num += global_neg[index]
+ area += (new_neg - neg) * (pos + new_pos) / 2
+ pos = new_pos
+ neg = new_neg
+ auc_value = None
+ if pos * neg == 0 or total_ins_num == 0:
+ auc_value = 0.5
+ else:
+ auc_value = area / (pos * neg)
+ return auc_value
+
+ def _calculate(self, global_metrics):
+ result = dict()
+ for key in self._global_metric_state_vars:
+ if key not in global_metrics:
+ raise ValueError("%s not existed" % key)
+ result[key] = global_metrics[key][0]
+
if result['total_ins_num'] == 0:
- self._result = result
- self._result['auc'] = 0
- self._result['bucket_error'] = 0
- self._result['actual_ctr'] = 0
- self._result['predict_ctr'] = 0
- self._result['mae'] = 0
- self._result['rmse'] = 0
- self._result['copc'] = 0
- self._result['mean_q'] = 0
- return self._result
- if 'stat_pos' in result and 'stat_neg' in result:
- result['auc'] = self.calculate_auc(result['stat_pos'],
- result['stat_neg'])
- result['bucket_error'] = self.calculate_auc(result['stat_pos'],
- result['stat_neg'])
- if 'pos_ins_num' in result:
+ result['auc'] = 0
+ result['bucket_error'] = 0
+ result['actual_ctr'] = 0
+ result['predict_ctr'] = 0
+ result['mae'] = 0
+ result['rmse'] = 0
+ result['copc'] = 0
+ result['mean_q'] = 0
+ else:
+ result['auc'] = self._calculate_auc(result['stat_pos'],
+ result['stat_neg'])
+ result['bucket_error'] = self._calculate_bucket_error(
+ result['stat_pos'], result['stat_neg'])
result['actual_ctr'] = result['pos_ins_num'] / result[
'total_ins_num']
- if 'abserr' in result:
result['mae'] = result['abserr'] / result['total_ins_num']
- if 'sqrerr' in result:
result['rmse'] = math.sqrt(result['sqrerr'] /
result['total_ins_num'])
- if 'prob' in result:
result['predict_ctr'] = result['prob'] / result['total_ins_num']
if abs(result['predict_ctr']) > 1e-6:
result['copc'] = result['actual_ctr'] / result['predict_ctr']
-
- if 'q' in result:
result['mean_q'] = result['q'] / result['total_ins_num']
- self._result = result
- return result
-
- def get_result(self):
- """ """
- return self._result
- def __str__(self):
- """ """
- result = self.get_result()
- result_str = "%s AUC=%.6f BUCKET_ERROR=%.6f MAE=%.6f RMSE=%.6f " \
+ result_str = "AUC=%.6f BUCKET_ERROR=%.6f MAE=%.6f RMSE=%.6f " \
"Actural_CTR=%.6f Predicted_CTR=%.6f COPC=%.6f MEAN Q_VALUE=%.6f Ins number=%s" % \
- (self._label, result['auc'], result['bucket_error'], result['mae'], result['rmse'],
+ (result['auc'], result['bucket_error'], result['mae'], result['rmse'],
result['actual_ctr'],
result['predict_ctr'], result['copc'], result['mean_q'], result['total_ins_num'])
return result_str
+
+ def get_result(self):
+ return self.metrics
diff --git a/core/metrics/pairwise_pn.py b/core/metrics/pairwise_pn.py
new file mode 100755
index 0000000000000000000000000000000000000000..fb10e1fc349d1120255f421cd510c40842eca557
--- /dev/null
+++ b/core/metrics/pairwise_pn.py
@@ -0,0 +1,101 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
+
+import math
+
+import numpy as np
+import paddle.fluid as fluid
+
+from paddlerec.core.metric import Metric
+from paddle.fluid.initializer import Constant
+from paddle.fluid.layer_helper import LayerHelper
+from paddle.fluid.layers.tensor import Variable
+
+
+class PosNegRatio(Metric):
+ """
+ Metric For Fluid Model
+ """
+
+ def __init__(self, pos_score, neg_score):
+ """ """
+ kwargs = locals()
+ del kwargs['self']
+
+ helper = LayerHelper("PaddleRec_PosNegRatio", **kwargs)
+ if "pos_score" not in kwargs or "neg_score" not in kwargs:
+ raise ValueError(
+ "PosNegRatio expect pos_score and neg_score as inputs.")
+ pos_score = kwargs.get('pos_score')
+ neg_score = kwargs.get('neg_score')
+
+ if not isinstance(pos_score, Variable):
+ raise ValueError("pos_score must be Variable, but received %s" %
+ type(pos_score))
+ if not isinstance(neg_score, Variable):
+ raise ValueError("neg_score must be Variable, but received %s" %
+ type(neg_score))
+
+ wrong = fluid.layers.cast(
+ fluid.layers.less_equal(pos_score, neg_score), dtype='float32')
+ wrong_cnt = fluid.layers.reduce_sum(wrong)
+ right = fluid.layers.cast(
+ fluid.layers.less_than(neg_score, pos_score), dtype='float32')
+ right_cnt = fluid.layers.reduce_sum(right)
+
+ global_right_cnt, _ = helper.create_or_get_global_variable(
+ name="right_cnt", persistable=True, dtype='float32', shape=[1])
+ global_wrong_cnt, _ = helper.create_or_get_global_variable(
+ name="wrong_cnt", persistable=True, dtype='float32', shape=[1])
+
+ for var in [global_right_cnt, global_wrong_cnt]:
+ helper.set_variable_initializer(
+ var, Constant(
+ value=0.0, force_cpu=True))
+
+ helper.append_op(
+ type="elementwise_add",
+ inputs={"X": [global_right_cnt],
+ "Y": [right_cnt]},
+ outputs={"Out": [global_right_cnt]})
+ helper.append_op(
+ type="elementwise_add",
+ inputs={"X": [global_wrong_cnt],
+ "Y": [wrong_cnt]},
+ outputs={"Out": [global_wrong_cnt]})
+ self.pn = (global_right_cnt + 1.0) / (global_wrong_cnt + 1.0)
+
+ self._global_metric_state_vars = dict()
+ self._global_metric_state_vars['right_cnt'] = (global_right_cnt.name,
+ "float32")
+ self._global_metric_state_vars['wrong_cnt'] = (global_wrong_cnt.name,
+ "float32")
+
+ self.metrics = dict()
+ self.metrics['WrongCnt'] = global_wrong_cnt
+ self.metrics['RightCnt'] = global_right_cnt
+ self.metrics['PN'] = self.pn
+
+ def _calculate(self, global_metrics):
+ for key in self._global_communicate_var:
+ if key not in global_metrics:
+ raise ValueError("%s not existed" % key)
+ pn = (global_metrics['right_cnt'][0] + 1.0) / (
+ global_metrics['wrong_cnt'][0] + 1.0)
+ return "RightCnt=%s WrongCnt=%s PN=%s" % (
+ str(global_metrics['right_cnt'][0]),
+ str(global_metrics['wrong_cnt'][0]), str(pn))
+
+ def get_result(self):
+ return self.metrics
diff --git a/core/metrics/precision.py b/core/metrics/precision.py
deleted file mode 100755
index 4b9b4bd3101854f70308455cabc67bb64249b5dc..0000000000000000000000000000000000000000
--- a/core/metrics/precision.py
+++ /dev/null
@@ -1,109 +0,0 @@
-# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
-#
-# Licensed 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.
-
-import math
-
-import numpy as np
-import paddle.fluid as fluid
-
-from paddlerec.core.metric import Metric
-from paddle.fluid.layers import nn, accuracy
-from paddle.fluid.initializer import Constant
-from paddle.fluid.layer_helper import LayerHelper
-
-
-class Precision(Metric):
- """
- Metric For Fluid Model
- """
-
- def __init__(self, **kwargs):
- """ """
- helper = LayerHelper("PaddleRec_Precision", **kwargs)
- self.batch_accuracy = accuracy(
- kwargs.get("input"), kwargs.get("label"), kwargs.get("k"))
- local_ins_num, _ = helper.create_or_get_global_variable(
- name="local_ins_num", persistable=True, dtype='float32',
- shape=[1])
- local_pos_num, _ = helper.create_or_get_global_variable(
- name="local_pos_num", persistable=True, dtype='float32',
- shape=[1])
-
- batch_pos_num, _ = helper.create_or_get_global_variable(
- name="batch_pos_num",
- persistable=False,
- dtype='float32',
- shape=[1])
- batch_ins_num, _ = helper.create_or_get_global_variable(
- name="batch_ins_num",
- persistable=False,
- dtype='float32',
- shape=[1])
-
- tmp_ones = helper.create_global_variable(
- name="batch_size_like_ones",
- persistable=False,
- dtype='float32',
- shape=[-1])
-
- for var in [
- batch_pos_num, batch_ins_num, local_pos_num, local_ins_num
- ]:
- print(var, type(var))
- helper.set_variable_initializer(
- var, Constant(
- value=0.0, force_cpu=True))
-
- helper.append_op(
- type='fill_constant_batch_size_like',
- inputs={"Input": kwargs.get("label")},
- outputs={'Out': [tmp_ones]},
- attrs={
- 'shape': [-1, 1],
- 'dtype': tmp_ones.dtype,
- 'value': float(1.0),
- })
- helper.append_op(
- type="reduce_sum",
- inputs={"X": [tmp_ones]},
- outputs={"Out": [batch_ins_num]})
-
- helper.append_op(
- type="elementwise_mul",
- inputs={"X": [batch_ins_num],
- "Y": [self.batch_accuracy]},
- outputs={"Out": [batch_pos_num]})
-
- helper.append_op(
- type="elementwise_add",
- inputs={"X": [local_pos_num],
- "Y": [batch_pos_num]},
- outputs={"Out": [local_pos_num]})
-
- helper.append_op(
- type="elementwise_add",
- inputs={"X": [local_ins_num],
- "Y": [batch_ins_num]},
- outputs={"Out": [local_ins_num]})
-
- self.accuracy = local_pos_num / local_ins_num
-
- self._need_clear_list = [("local_ins_num", "float32"),
- ("local_pos_num", "float32")]
- self.metrics = dict()
- metric_varname = "P@%d" % kwargs.get("k")
- self.metrics[metric_varname] = self.accuracy
-
- def get_result(self):
- return self.metrics
diff --git a/core/metrics/precision_recall.py b/core/metrics/precision_recall.py
new file mode 100755
index 0000000000000000000000000000000000000000..f7f25ca808642c4a8543bdd464b4748c421653e8
--- /dev/null
+++ b/core/metrics/precision_recall.py
@@ -0,0 +1,156 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
+
+import math
+
+import numpy as np
+import paddle.fluid as fluid
+
+from paddlerec.core.metric import Metric
+from paddle.fluid.initializer import Constant
+from paddle.fluid.layer_helper import LayerHelper
+from paddle.fluid.layers.tensor import Variable
+
+
+class PrecisionRecall(Metric):
+ """
+ Metric For Fluid Model
+ """
+
+ def __init__(self, input, label, class_num):
+ """R
+ """
+ kwargs = locals()
+ del kwargs['self']
+
+ self.num_cls = class_num
+
+ if not isinstance(input, Variable):
+ raise ValueError("input must be Variable, but received %s" %
+ type(input))
+ if not isinstance(label, Variable):
+ raise ValueError("label must be Variable, but received %s" %
+ type(label))
+
+ helper = LayerHelper("PaddleRec_PrecisionRecall", **kwargs)
+ label = fluid.layers.cast(label, dtype="int32")
+ label.stop_gradient = True
+ max_probs, indices = fluid.layers.nn.topk(input, k=1)
+ indices = fluid.layers.cast(indices, dtype="int32")
+ indices.stop_gradient = True
+
+ states_info, _ = helper.create_or_get_global_variable(
+ name="states_info",
+ persistable=True,
+ dtype='float32',
+ shape=[self.num_cls, 4])
+ states_info.stop_gradient = True
+
+ helper.set_variable_initializer(
+ states_info, Constant(
+ value=0.0, force_cpu=True))
+
+ batch_metrics, _ = helper.create_or_get_global_variable(
+ name="batch_metrics",
+ persistable=False,
+ dtype='float32',
+ shape=[6])
+ accum_metrics, _ = helper.create_or_get_global_variable(
+ name="global_metrics",
+ persistable=False,
+ dtype='float32',
+ shape=[6])
+
+ batch_states = fluid.layers.fill_constant(
+ shape=[self.num_cls, 4], value=0.0, dtype="float32")
+ batch_states.stop_gradient = True
+
+ helper.append_op(
+ type="precision_recall",
+ attrs={'class_number': self.num_cls},
+ inputs={
+ 'MaxProbs': [max_probs],
+ 'Indices': [indices],
+ 'Labels': [label],
+ 'StatesInfo': [states_info]
+ },
+ outputs={
+ 'BatchMetrics': [batch_metrics],
+ 'AccumMetrics': [accum_metrics],
+ 'AccumStatesInfo': [batch_states]
+ })
+ helper.append_op(
+ type="assign",
+ inputs={'X': [batch_states]},
+ outputs={'Out': [states_info]})
+
+ batch_states.stop_gradient = True
+ states_info.stop_gradient = True
+
+ self._global_metric_state_vars = dict()
+ self._global_metric_state_vars['states_info'] = (states_info.name,
+ "float32")
+
+ self.metrics = dict()
+ self.metrics["precision_recall_f1"] = accum_metrics
+ self.metrics["[TP FP TN FN]"] = states_info
+
+ def _calculate(self, global_metrics):
+ for key in self._global_metric_state_vars:
+ if key not in global_metrics:
+ raise ValueError("%s not existed" % key)
+
+ def calc_precision(tp_count, fp_count):
+ if tp_count > 0.0 or fp_count > 0.0:
+ return tp_count / (tp_count + fp_count)
+ return 1.0
+
+ def calc_recall(tp_count, fn_count):
+ if tp_count > 0.0 or fn_count > 0.0:
+ return tp_count / (tp_count + fn_count)
+ return 1.0
+
+ def calc_f1_score(precision, recall):
+ if precision > 0.0 or recall > 0.0:
+ return 2 * precision * recall / (precision + recall)
+ return 0.0
+
+ states = global_metrics["states_info"]
+ total_tp_count = 0.0
+ total_fp_count = 0.0
+ total_fn_count = 0.0
+ macro_avg_precision = 0.0
+ macro_avg_recall = 0.0
+ for i in range(self.num_cls):
+ total_tp_count += states[i][0]
+ total_fp_count += states[i][1]
+ total_fn_count += states[i][3]
+ macro_avg_precision += calc_precision(states[i][0], states[i][1])
+ macro_avg_recall += calc_recall(states[i][0], states[i][3])
+ metrics = []
+ macro_avg_precision /= self.num_cls
+ macro_avg_recall /= self.num_cls
+ metrics.append(macro_avg_precision)
+ metrics.append(macro_avg_recall)
+ metrics.append(calc_f1_score(macro_avg_precision, macro_avg_recall))
+ micro_avg_precision = calc_precision(total_tp_count, total_fp_count)
+ metrics.append(micro_avg_precision)
+ micro_avg_recall = calc_recall(total_tp_count, total_fn_count)
+ metrics.append(micro_avg_recall)
+ metrics.append(calc_f1_score(micro_avg_precision, micro_avg_recall))
+ return "total metrics: [TP, FP, TN, FN]=%s; precision_recall_f1=%s" % (
+ str(states), str(np.array(metrics).astype('float32')))
+
+ def get_result(self):
+ return self.metrics
diff --git a/core/metrics/recall_k.py b/core/metrics/recall_k.py
new file mode 100755
index 0000000000000000000000000000000000000000..f727c25e97bf1486886310c30e2304cba568c8b8
--- /dev/null
+++ b/core/metrics/recall_k.py
@@ -0,0 +1,103 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
+
+import math
+
+import numpy as np
+import paddle.fluid as fluid
+
+from paddlerec.core.metric import Metric
+from paddle.fluid.layers import accuracy
+from paddle.fluid.initializer import Constant
+from paddle.fluid.layer_helper import LayerHelper
+from paddle.fluid.layers.tensor import Variable
+
+
+class RecallK(Metric):
+ """
+ Metric For Fluid Model
+ """
+
+ def __init__(self, input, label, k=20):
+ """ """
+ kwargs = locals()
+ del kwargs['self']
+ self.k = k
+
+ if not isinstance(input, Variable):
+ raise ValueError("input must be Variable, but received %s" %
+ type(input))
+ if not isinstance(label, Variable):
+ raise ValueError("label must be Variable, but received %s" %
+ type(label))
+
+ helper = LayerHelper("PaddleRec_RecallK", **kwargs)
+ batch_accuracy = accuracy(input, label, self.k)
+ global_ins_cnt, _ = helper.create_or_get_global_variable(
+ name="ins_cnt", persistable=True, dtype='float32', shape=[1])
+ global_pos_cnt, _ = helper.create_or_get_global_variable(
+ name="pos_cnt", persistable=True, dtype='float32', shape=[1])
+
+ for var in [global_ins_cnt, global_pos_cnt]:
+ helper.set_variable_initializer(
+ var, Constant(
+ value=0.0, force_cpu=True))
+
+ tmp_ones = fluid.layers.fill_constant(
+ shape=fluid.layers.shape(label), dtype="float32", value=1.0)
+ batch_ins = fluid.layers.reduce_sum(tmp_ones)
+ batch_pos = batch_ins * batch_accuracy
+
+ helper.append_op(
+ type="elementwise_add",
+ inputs={"X": [global_ins_cnt],
+ "Y": [batch_ins]},
+ outputs={"Out": [global_ins_cnt]})
+
+ helper.append_op(
+ type="elementwise_add",
+ inputs={"X": [global_pos_cnt],
+ "Y": [batch_pos]},
+ outputs={"Out": [global_pos_cnt]})
+
+ self.acc = global_pos_cnt / global_ins_cnt
+
+ self._global_metric_state_vars = dict()
+ self._global_metric_state_vars['ins_cnt'] = (global_ins_cnt.name,
+ "float32")
+ self._global_metric_state_vars['pos_cnt'] = (global_pos_cnt.name,
+ "float32")
+
+ metric_name = "Acc(Recall@%d)" % self.k
+ self.metrics = dict()
+ self.metrics["InsCnt"] = global_ins_cnt
+ self.metrics["RecallCnt"] = global_pos_cnt
+ self.metrics[metric_name] = self.acc
+
+ # self.metrics["batch_metrics"] = batch_metrics
+ def _calculate(self, global_metrics):
+ for key in self._global_metric_state_vars:
+ if key not in global_metrics:
+ raise ValueError("%s not existed" % key)
+ ins_cnt = global_metrics['ins_cnt'][0]
+ pos_cnt = global_metrics['pos_cnt'][0]
+ if ins_cnt == 0:
+ acc = 0
+ else:
+ acc = float(pos_cnt) / ins_cnt
+ return "InsCnt=%s RecallCnt=%s Acc(Recall@%d)=%s" % (
+ str(ins_cnt), str(pos_cnt), self.k, str(acc))
+
+ def get_result(self):
+ return self.metrics
diff --git a/core/trainer.py b/core/trainer.py
index 8b1afd449a70265d5bcae9996d42795a1235197a..bbba6250529283d24389e2719b7110f8aa321973 100755
--- a/core/trainer.py
+++ b/core/trainer.py
@@ -107,6 +107,7 @@ class Trainer(object):
self.device = Device.GPU
gpu_id = int(os.environ.get('FLAGS_selected_gpus', 0))
self._place = fluid.CUDAPlace(gpu_id)
+ print("PaddleRec run on device GPU: {}".format(gpu_id))
self._exe = fluid.Executor(self._place)
elif device == "CPU":
self.device = Device.CPU
@@ -146,6 +147,7 @@ class Trainer(object):
elif engine.upper() == "CLUSTER":
self.engine = EngineMode.CLUSTER
self.is_fleet = True
+ self.which_cluster_type()
else:
raise ValueError("Not Support Engine {}".format(engine))
self._context["is_fleet"] = self.is_fleet
@@ -165,6 +167,14 @@ class Trainer(object):
self._context["is_pslib"] = (fleet_mode.upper() == "PSLIB")
self._context["fleet_mode"] = fleet_mode
+ def which_cluster_type(self):
+ cluster_type = os.getenv("PADDLEREC_CLUSTER_TYPE", "MPI")
+ print("PADDLEREC_CLUSTER_TYPE: {}".format(cluster_type))
+ if cluster_type and cluster_type.upper() == "K8S":
+ self._context["cluster_type"] = "K8S"
+ else:
+ self._context["cluster_type"] = "MPI"
+
def which_executor_mode(self):
executor_mode = envs.get_runtime_environ("train.trainer.executor_mode")
if executor_mode.upper() not in ["TRAIN", "INFER"]:
diff --git a/core/trainers/finetuning_trainer.py b/core/trainers/finetuning_trainer.py
new file mode 100644
index 0000000000000000000000000000000000000000..4525a18867ff232121256c876c185c502427c130
--- /dev/null
+++ b/core/trainers/finetuning_trainer.py
@@ -0,0 +1,140 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
+"""
+General Trainer, applicable to many situations: Single/Cluster/Local_Cluster + PS/COLLECTIVE
+"""
+from __future__ import print_function
+
+import os
+
+from paddlerec.core.utils import envs
+from paddlerec.core.trainer import Trainer, EngineMode, FleetMode
+
+
+class FineTuningTrainer(Trainer):
+ """
+ Trainer for various situations
+ """
+
+ def __init__(self, config=None):
+ Trainer.__init__(self, config)
+ self.processor_register()
+ self.abs_dir = os.path.dirname(os.path.abspath(__file__))
+ self.runner_env_name = "runner." + self._context["runner_name"]
+
+ def processor_register(self):
+ print("processor_register begin")
+ self.regist_context_processor('uninit', self.instance)
+ self.regist_context_processor('network_pass', self.network)
+ self.regist_context_processor('startup_pass', self.startup)
+ self.regist_context_processor('train_pass', self.runner)
+ self.regist_context_processor('terminal_pass', self.terminal)
+
+ def instance(self, context):
+ instance_class_path = envs.get_global_env(
+ self.runner_env_name + ".instance_class_path", default_value=None)
+ if instance_class_path:
+ instance_class = envs.lazy_instance_by_fliename(
+ instance_class_path, "Instance")(context)
+ else:
+ if self.engine == EngineMode.SINGLE:
+ instance_class_name = "SingleInstance"
+ else:
+ raise ValueError(
+ "FineTuningTrainer can only support SingleTraining.")
+
+ instance_path = os.path.join(self.abs_dir, "framework",
+ "instance.py")
+
+ instance_class = envs.lazy_instance_by_fliename(
+ instance_path, instance_class_name)(context)
+
+ instance_class.instance(context)
+
+ def network(self, context):
+ network_class_path = envs.get_global_env(
+ self.runner_env_name + ".network_class_path", default_value=None)
+ if network_class_path:
+ network_class = envs.lazy_instance_by_fliename(network_class_path,
+ "Network")(context)
+ else:
+ if self.engine == EngineMode.SINGLE:
+ network_class_name = "FineTuningNetwork"
+ else:
+ raise ValueError(
+ "FineTuningTrainer can only support SingleTraining.")
+
+ network_path = os.path.join(self.abs_dir, "framework",
+ "network.py")
+ network_class = envs.lazy_instance_by_fliename(
+ network_path, network_class_name)(context)
+
+ network_class.build_network(context)
+
+ def startup(self, context):
+ startup_class_path = envs.get_global_env(
+ self.runner_env_name + ".startup_class_path", default_value=None)
+ if startup_class_path:
+ startup_class = envs.lazy_instance_by_fliename(startup_class_path,
+ "Startup")(context)
+ else:
+ if self.engine == EngineMode.SINGLE and not context["is_infer"]:
+ startup_class_name = "FineTuningStartup"
+ else:
+ raise ValueError(
+ "FineTuningTrainer can only support SingleTraining.")
+
+ startup_path = os.path.join(self.abs_dir, "framework",
+ "startup.py")
+
+ startup_class = envs.lazy_instance_by_fliename(
+ startup_path, startup_class_name)(context)
+ startup_class.startup(context)
+
+ def runner(self, context):
+ runner_class_path = envs.get_global_env(
+ self.runner_env_name + ".runner_class_path", default_value=None)
+ if runner_class_path:
+ runner_class = envs.lazy_instance_by_fliename(runner_class_path,
+ "Runner")(context)
+ else:
+ if self.engine == EngineMode.SINGLE and not context["is_infer"]:
+ runner_class_name = "SingleRunner"
+ else:
+ raise ValueError(
+ "FineTuningTrainer can only support SingleTraining.")
+
+ runner_path = os.path.join(self.abs_dir, "framework", "runner.py")
+ runner_class = envs.lazy_instance_by_fliename(
+ runner_path, runner_class_name)(context)
+ runner_class.run(context)
+
+ def terminal(self, context):
+ terminal_class_path = envs.get_global_env(
+ self.runner_env_name + ".terminal_class_path", default_value=None)
+ if terminal_class_path:
+ terminal_class = envs.lazy_instance_by_fliename(
+ terminal_class_path, "Terminal")(context)
+ terminal_class.terminal(context)
+ else:
+ terminal_class_name = "TerminalBase"
+ if self.engine != EngineMode.SINGLE and self.fleet_mode != FleetMode.COLLECTIVE:
+ terminal_class_name = "PSTerminal"
+
+ terminal_path = os.path.join(self.abs_dir, "framework",
+ "terminal.py")
+ terminal_class = envs.lazy_instance_by_fliename(
+ terminal_path, terminal_class_name)(context)
+ terminal_class.terminal(context)
+ context['is_exit'] = True
diff --git a/core/trainers/framework/dataset.py b/core/trainers/framework/dataset.py
index 8059eeb09a482671b8329fb88f5b52cfd64f163b..5c5a2357ff4a07d54d4e0c56e692b4d79fcb2095 100644
--- a/core/trainers/framework/dataset.py
+++ b/core/trainers/framework/dataset.py
@@ -123,10 +123,21 @@ class QueueDataset(DatasetBase):
os.path.join(train_data_path, x)
for x in os.listdir(train_data_path)
]
+ file_list.sort()
+ need_split_files = False
if context["engine"] == EngineMode.LOCAL_CLUSTER:
+ # for local cluster: split files for multi process
+ need_split_files = True
+ elif context["engine"] == EngineMode.CLUSTER and context[
+ "cluster_type"] == "K8S":
+ # for k8s mount afs, split files for every node
+ need_split_files = True
+
+ if need_split_files:
file_list = split_files(file_list, context["fleet"].worker_index(),
context["fleet"].worker_num())
print("File_list: {}".format(file_list))
+
dataset.set_filelist(file_list)
for model_dict in context["phases"]:
if model_dict["dataset_name"] == dataset_name:
diff --git a/core/trainers/framework/network.py b/core/trainers/framework/network.py
index 74d2c97540419b15e6a5d0f87b3c5af368a7e9b3..7d7a8273b6a402bd163f653a7beb3900de899ae3 100644
--- a/core/trainers/framework/network.py
+++ b/core/trainers/framework/network.py
@@ -23,7 +23,7 @@ from paddlerec.core.trainers.framework.dataset import DataLoader, QueueDataset
__all__ = [
"NetworkBase", "SingleNetwork", "PSNetwork", "PslibNetwork",
- "CollectiveNetwork"
+ "CollectiveNetwork", "FineTuningNetwork"
]
@@ -99,7 +99,90 @@ class SingleNetwork(NetworkBase):
context["dataset"] = {}
for dataset in context["env"]["dataset"]:
type = envs.get_global_env("dataset." + dataset["name"] + ".type")
- if type != "DataLoader":
+
+ if type == "QueueDataset":
+ dataset_class = QueueDataset(context)
+ context["dataset"][dataset[
+ "name"]] = dataset_class.create_dataset(dataset["name"],
+ context)
+
+ context["status"] = "startup_pass"
+
+
+class FineTuningNetwork(NetworkBase):
+ """R
+ """
+
+ def __init__(self, context):
+ print("Running FineTuningNetwork.")
+
+ def build_network(self, context):
+ context["model"] = {}
+ for model_dict in context["phases"]:
+ context["model"][model_dict["name"]] = {}
+ train_program = fluid.Program()
+ startup_program = fluid.Program()
+ scope = fluid.Scope()
+ dataset_name = model_dict["dataset_name"]
+
+ with fluid.program_guard(train_program, startup_program):
+ with fluid.unique_name.guard():
+ with fluid.scope_guard(scope):
+ model_path = envs.os_path_adapter(
+ envs.workspace_adapter(model_dict["model"]))
+ model = envs.lazy_instance_by_fliename(
+ model_path, "Model")(context["env"])
+
+ model._data_var = model.input_data(
+ dataset_name=model_dict["dataset_name"])
+
+ if envs.get_global_env("dataset." + dataset_name +
+ ".type") == "DataLoader":
+ model._init_dataloader(
+ is_infer=context["is_infer"])
+ data_loader = DataLoader(context)
+ data_loader.get_dataloader(context, dataset_name,
+ model._data_loader)
+
+ model.net(model._data_var, context["is_infer"])
+
+ finetuning_varnames = envs.get_global_env(
+ "runner." + context["runner_name"] +
+ ".finetuning_aspect_varnames",
+ default_value=[])
+
+ if len(finetuning_varnames) == 0:
+ raise ValueError(
+ "nothing need to be fine tuning, you may use other traning mode"
+ )
+
+ if len(finetuning_varnames) != 1:
+ raise ValueError(
+ "fine tuning mode can only accept one varname now"
+ )
+
+ varname = finetuning_varnames[0]
+ finetuning_vars = train_program.global_block().vars[
+ varname]
+ finetuning_vars.stop_gradient = True
+ optimizer = model.optimizer()
+ optimizer.minimize(model._cost)
+
+ context["model"][model_dict["name"]][
+ "main_program"] = train_program
+ context["model"][model_dict["name"]][
+ "startup_program"] = startup_program
+ context["model"][model_dict["name"]]["scope"] = scope
+ context["model"][model_dict["name"]]["model"] = model
+ context["model"][model_dict["name"]][
+ "default_main_program"] = train_program.clone()
+ context["model"][model_dict["name"]]["compiled_program"] = None
+
+ context["dataset"] = {}
+ for dataset in context["env"]["dataset"]:
+ type = envs.get_global_env("dataset." + dataset["name"] + ".type")
+
+ if type == "QueueDataset":
dataset_class = QueueDataset(context)
context["dataset"][dataset[
"name"]] = dataset_class.create_dataset(dataset["name"],
@@ -133,9 +216,7 @@ class PSNetwork(NetworkBase):
if envs.get_global_env("dataset." + dataset_name +
".type") == "DataLoader":
model._init_dataloader(is_infer=False)
- data_loader = DataLoader(context)
- data_loader.get_dataloader(context, dataset_name,
- model._data_loader)
+
model.net(model._data_var, False)
optimizer = model.optimizer()
strategy = self._build_strategy(context)
@@ -160,7 +241,11 @@ class PSNetwork(NetworkBase):
for dataset in context["env"]["dataset"]:
type = envs.get_global_env("dataset." + dataset["name"] +
".type")
- if type != "DataLoader":
+ if type == "DataLoader":
+ data_loader = DataLoader(context)
+ data_loader.get_dataloader(context, dataset_name,
+ model._data_loader)
+ elif type == "QueueDataset":
dataset_class = QueueDataset(context)
context["dataset"][dataset[
"name"]] = dataset_class.create_dataset(
@@ -229,9 +314,6 @@ class PslibNetwork(NetworkBase):
if envs.get_global_env("dataset." + dataset_name +
".type") == "DataLoader":
model._init_dataloader(is_infer=False)
- data_loader = DataLoader(context)
- data_loader.get_dataloader(context, dataset_name,
- model._data_loader)
model.net(model._data_var, False)
optimizer = model.optimizer()
@@ -257,7 +339,11 @@ class PslibNetwork(NetworkBase):
for dataset in context["env"]["dataset"]:
type = envs.get_global_env("dataset." + dataset["name"] +
".type")
- if type != "DataLoader":
+ if type == "DataLoader":
+ data_loader = DataLoader(context)
+ data_loader.get_dataloader(context, dataset_name, context[
+ "model"][model_dict["name"]]["model"]._data_loader)
+ elif type == "QueueDataset":
dataset_class = QueueDataset(context)
context["dataset"][dataset[
"name"]] = dataset_class.create_dataset(
@@ -323,7 +409,10 @@ class CollectiveNetwork(NetworkBase):
context["dataset"] = {}
for dataset in context["env"]["dataset"]:
type = envs.get_global_env("dataset." + dataset["name"] + ".type")
- if type != "DataLoader":
+ if type == "QueueDataset":
+ raise ValueError(
+ "Collective don't support QueueDataset training, please use DataLoader."
+ )
dataset_class = QueueDataset(context)
context["dataset"][dataset[
"name"]] = dataset_class.create_dataset(dataset["name"],
diff --git a/core/trainers/framework/runner.py b/core/trainers/framework/runner.py
index d5fced11ffd546b36ee7db3e596f061bf8a58328..79d7be66e58d0c4244980cf4bf871f42984d186e 100644
--- a/core/trainers/framework/runner.py
+++ b/core/trainers/framework/runner.py
@@ -16,10 +16,12 @@ from __future__ import print_function
import os
import time
+import warnings
import numpy as np
import paddle.fluid as fluid
from paddlerec.core.utils import envs
+from paddlerec.core.metric import Metric
__all__ = [
"RunnerBase", "SingleRunner", "PSRunner", "CollectiveRunner", "PslibRunner"
@@ -77,9 +79,10 @@ class RunnerBase(object):
name = "dataset." + reader_name + "."
if envs.get_global_env(name + "type") == "DataLoader":
- self._executor_dataloader_train(model_dict, context)
+ return self._executor_dataloader_train(model_dict, context)
else:
self._executor_dataset_train(model_dict, context)
+ return None
def _executor_dataset_train(self, model_dict, context):
reader_name = model_dict["dataset_name"]
@@ -137,8 +140,10 @@ class RunnerBase(object):
metrics_varnames = []
metrics_format = []
+ metrics_names = ["total_batch"]
metrics_format.append("{}: {{}}".format("batch"))
for name, var in metrics.items():
+ metrics_names.append(name)
metrics_varnames.append(var.name)
metrics_format.append("{}: {{}}".format(name))
metrics_format = ", ".join(metrics_format)
@@ -147,6 +152,7 @@ class RunnerBase(object):
reader.start()
batch_id = 0
scope = context["model"][model_name]["scope"]
+ result = None
with fluid.scope_guard(scope):
try:
while True:
@@ -168,6 +174,10 @@ class RunnerBase(object):
except fluid.core.EOFException:
reader.reset()
+ if batch_id > 0:
+ result = dict(zip(metrics_names, metrics))
+ return result
+
def _get_dataloader_program(self, model_dict, context):
model_name = model_dict["name"]
if context["model"][model_name]["compiled_program"] == None:
@@ -275,6 +285,7 @@ class RunnerBase(object):
return (epoch_id + 1) % epoch_interval == 0
def save_inference_model():
+ # get global env
name = "runner." + context["runner_name"] + "."
save_interval = int(
envs.get_global_env(name + "save_inference_interval", -1))
@@ -287,18 +298,44 @@ class RunnerBase(object):
if feed_varnames is None or fetch_varnames is None or feed_varnames == "" or fetch_varnames == "" or \
len(feed_varnames) == 0 or len(fetch_varnames) == 0:
return
- fetch_vars = [
- fluid.default_main_program().global_block().vars[varname]
- for varname in fetch_varnames
- ]
+
+ # check feed var exist
+ for var_name in feed_varnames:
+ if var_name not in fluid.default_main_program().global_block(
+ ).vars:
+ raise ValueError(
+ "Feed variable: {} not in default_main_program, global block has follow vars: {}".
+ format(var_name,
+ fluid.default_main_program().global_block()
+ .vars.keys()))
+
+ # check fetch var exist
+ fetch_vars = []
+ for var_name in fetch_varnames:
+ if var_name not in fluid.default_main_program().global_block(
+ ).vars:
+ raise ValueError(
+ "Fetch variable: {} not in default_main_program, global block has follow vars: {}".
+ format(var_name,
+ fluid.default_main_program().global_block()
+ .vars.keys()))
+ else:
+ fetch_vars.append(fluid.default_main_program()
+ .global_block().vars[var_name])
+
dirname = envs.get_global_env(name + "save_inference_path", None)
assert dirname is not None
dirname = os.path.join(dirname, str(epoch_id))
if is_fleet:
- context["fleet"].save_inference_model(
- context["exe"], dirname, feed_varnames, fetch_vars)
+ warnings.warn(
+ "Save inference model in cluster training is not recommended! Using save checkpoint instead.",
+ category=UserWarning,
+ stacklevel=2)
+ if context["fleet"].worker_index() == 0:
+ context["fleet"].save_inference_model(
+ context["exe"], dirname, feed_varnames, fetch_vars)
else:
fluid.io.save_inference_model(dirname, feed_varnames,
fetch_vars, context["exe"])
@@ -314,7 +351,8 @@ class RunnerBase(object):
return
dirname = os.path.join(dirname, str(epoch_id))
if is_fleet:
- context["fleet"].save_persistables(context["exe"], dirname)
+ if context["fleet"].worker_index() == 0:
+ context["fleet"].save_persistables(context["exe"], dirname)
else:
fluid.io.save_persistables(context["exe"], dirname)
@@ -336,11 +374,28 @@ class SingleRunner(RunnerBase):
".epochs"))
for epoch in range(epochs):
for model_dict in context["phases"]:
+ model_class = context["model"][model_dict["name"]]["model"]
+ metrics = model_class._metrics
+
begin_time = time.time()
- self._run(context, model_dict)
+ result = self._run(context, model_dict)
end_time = time.time()
seconds = end_time - begin_time
- print("epoch {} done, use time: {}".format(epoch, seconds))
+ message = "epoch {} done, use time: {}".format(epoch, seconds)
+ metrics_result = []
+ for key in metrics:
+ if isinstance(metrics[key], Metric):
+ _str = metrics[key].calc_global_metrics(
+ None,
+ context["model"][model_dict["name"]]["scope"])
+ metrics_result.append(_str)
+ elif result is not None:
+ _str = "{}={}".format(key, result[key])
+ metrics_result.append(_str)
+ if len(metrics_result) > 0:
+ message += ", global metrics: " + ", ".join(metrics_result)
+ print(message)
+
with fluid.scope_guard(context["model"][model_dict["name"]][
"scope"]):
train_prog = context["model"][model_dict["name"]][
@@ -362,12 +417,32 @@ class PSRunner(RunnerBase):
envs.get_global_env("runner." + context["runner_name"] +
".epochs"))
model_dict = context["env"]["phase"][0]
+ model_class = context["model"][model_dict["name"]]["model"]
+ metrics = model_class._metrics
for epoch in range(epochs):
begin_time = time.time()
- self._run(context, model_dict)
+ result = self._run(context, model_dict)
end_time = time.time()
seconds = end_time - begin_time
- print("epoch {} done, use time: {}".format(epoch, seconds))
+ message = "epoch {} done, use time: {}".format(epoch, seconds)
+
+ # TODO, wait for PaddleCloudRoleMaker supports gloo
+ from paddle.fluid.incubate.fleet.base.role_maker import GeneralRoleMaker
+ if context["fleet"] is not None and isinstance(context["fleet"],
+ GeneralRoleMaker):
+ metrics_result = []
+ for key in metrics:
+ if isinstance(metrics[key], Metric):
+ _str = metrics[key].calc_global_metrics(
+ context["fleet"],
+ context["model"][model_dict["name"]]["scope"])
+ metrics_result.append(_str)
+ elif result is not None:
+ _str = "{}={}".format(key, result[key])
+ metrics_result.append(_str)
+ if len(metrics_result) > 0:
+ message += ", global metrics: " + ", ".join(metrics_result)
+ print(message)
with fluid.scope_guard(context["model"][model_dict["name"]][
"scope"]):
train_prog = context["model"][model_dict["name"]][
@@ -476,14 +551,30 @@ class SingleInferRunner(RunnerBase):
for index, epoch_name in enumerate(self.epoch_model_name_list):
for model_dict in context["phases"]:
+ model_class = context["model"][model_dict["name"]]["model"]
+ metrics = model_class._infer_results
self._load(context, model_dict,
self.epoch_model_path_list[index])
begin_time = time.time()
- self._run(context, model_dict)
+ result = self._run(context, model_dict)
end_time = time.time()
seconds = end_time - begin_time
- print("Infer {} of {} done, use time: {}".format(model_dict[
- "name"], epoch_name, seconds))
+ message = "Infer {} of epoch {} done, use time: {}".format(
+ model_dict["name"], epoch_name, seconds)
+ metrics_result = []
+ for key in metrics:
+ if isinstance(metrics[key], Metric):
+ _str = metrics[key].calc_global_metrics(
+ None,
+ context["model"][model_dict["name"]]["scope"])
+ metrics_result.append(_str)
+ elif result is not None:
+ _str = "{}={}".format(key, result[key])
+ metrics_result.append(_str)
+ if len(metrics_result) > 0:
+ message += ", global metrics: " + ", ".join(metrics_result)
+ print(message)
+
context["status"] = "terminal_pass"
def _load(self, context, model_dict, model_path):
diff --git a/core/trainers/framework/startup.py b/core/trainers/framework/startup.py
index 362592e6de64a4bbfecb6868726b4a733edf4e14..a38dbd5bb3c2cea268fc5551e10e488f2fbdabd6 100644
--- a/core/trainers/framework/startup.py
+++ b/core/trainers/framework/startup.py
@@ -17,9 +17,13 @@ from __future__ import print_function
import warnings
import paddle.fluid as fluid
+import paddle.fluid.core as core
from paddlerec.core.utils import envs
-__all__ = ["StartupBase", "SingleStartup", "PSStartup", "CollectiveStartup"]
+__all__ = [
+ "StartupBase", "SingleStartup", "PSStartup", "CollectiveStartup",
+ "FineTuningStartup"
+]
class StartupBase(object):
@@ -65,6 +69,122 @@ class SingleStartup(StartupBase):
context["status"] = "train_pass"
+class FineTuningStartup(StartupBase):
+ """R
+ """
+
+ def __init__(self, context):
+ self.op_name_scope = "op_namescope"
+ self.clip_op_name_scope = "@CLIP"
+ self.self.op_role_var_attr_name = core.op_proto_and_checker_maker.kOpRoleVarAttrName(
+ )
+
+ print("Running SingleStartup.")
+
+ def _is_opt_role_op(self, op):
+ # NOTE: depend on oprole to find out whether this op is for
+ # optimize
+ op_maker = core.op_proto_and_checker_maker
+ optimize_role = core.op_proto_and_checker_maker.OpRole.Optimize
+ if op_maker.kOpRoleAttrName() in op.attr_names and \
+ int(op.all_attrs()[op_maker.kOpRoleAttrName()]) == int(optimize_role):
+ return True
+ return False
+
+ def _get_params_grads(self, program):
+ """
+ Get optimizer operators, parameters and gradients from origin_program
+ Returns:
+ opt_ops (list): optimize operators.
+ params_grads (dict): parameter->gradient.
+ """
+ block = program.global_block()
+ params_grads = []
+ # tmp set to dedup
+ optimize_params = set()
+ origin_var_dict = program.global_block().vars
+ for op in block.ops:
+ if self._is_opt_role_op(op):
+ # Todo(chengmo): Whether clip related op belongs to Optimize guard should be discussed
+ # delete clip op from opt_ops when run in Parameter Server mode
+ if self.op_name_scope in op.all_attrs(
+ ) and self.clip_op_name_scope in op.attr(self.op_name_scope):
+ op._set_attr(
+ "op_role",
+ int(core.op_proto_and_checker_maker.OpRole.Backward))
+ continue
+
+ if op.attr(self.op_role_var_attr_name):
+ param_name = op.attr(self.op_role_var_attr_name)[0]
+ grad_name = op.attr(self.op_role_var_attr_name)[1]
+ if not param_name in optimize_params:
+ optimize_params.add(param_name)
+ params_grads.append([
+ origin_var_dict[param_name],
+ origin_var_dict[grad_name]
+ ])
+ return params_grads
+
+ @staticmethod
+ def is_persistable(var):
+ """
+ Check whether the given variable is persistable.
+
+ Args:
+ var(Variable): The variable to be checked.
+
+ Returns:
+ bool: True if the given `var` is persistable
+ False if not.
+
+ Examples:
+ .. code-block:: python
+
+ import paddle.fluid as fluid
+ param = fluid.default_main_program().global_block().var('fc.b')
+ res = fluid.io.is_persistable(param)
+ """
+ if var.desc.type() == core.VarDesc.VarType.FEED_MINIBATCH or \
+ var.desc.type() == core.VarDesc.VarType.FETCH_LIST or \
+ var.desc.type() == core.VarDesc.VarType.READER:
+ return False
+ return var.persistable
+
+ def load(self, context, is_fleet=False, main_program=None):
+ dirname = envs.get_global_env(
+ "runner." + context["runner_name"] + ".init_model_path", None)
+ if dirname is None or dirname == "":
+ return
+ print("going to load ", dirname)
+
+ params_grads = self._get_params_grads(main_program)
+ update_params = [p for p, _ in params_grads]
+ need_load_vars = []
+ parameters = list(
+ filter(FineTuningStartup.is_persistable, main_program.list_vars()))
+
+ for param in parameters:
+ if param not in update_params:
+ need_load_vars.append(param)
+
+ fluid.io.load_vars(context["exe"], dirname, main_program,
+ need_load_vars)
+ print("load from {} success".format(dirname))
+
+ def startup(self, context):
+ for model_dict in context["phases"]:
+ with fluid.scope_guard(context["model"][model_dict["name"]][
+ "scope"]):
+ train_prog = context["model"][model_dict["name"]][
+ "main_program"]
+ startup_prog = context["model"][model_dict["name"]][
+ "startup_program"]
+ with fluid.program_guard(train_prog, startup_prog):
+ context["exe"].run(startup_prog)
+ self.load(context, main_program=train_prog)
+ context["status"] = "train_pass"
+
+
class PSStartup(StartupBase):
def __init__(self, context):
print("Running PSStartup.")
diff --git a/core/utils/dataloader_instance.py b/core/utils/dataloader_instance.py
index 2461473aa79a51133db8aa319f4ee7d45981d815..d878f08415c7b0405bc593f06ab4541801aa5501 100755
--- a/core/utils/dataloader_instance.py
+++ b/core/utils/dataloader_instance.py
@@ -39,9 +39,21 @@ def dataloader_by_name(readerclass,
data_path = os.path.join(package_base, data_path.split("::")[1])
files = [str(data_path) + "/%s" % x for x in os.listdir(data_path)]
+ files.sort()
+
+ need_split_files = False
if context["engine"] == EngineMode.LOCAL_CLUSTER:
+ # for local cluster: split files for multi process
+ need_split_files = True
+ elif context["engine"] == EngineMode.CLUSTER and context[
+ "cluster_type"] == "K8S":
+ # for k8s mount mode, split files for every node
+ need_split_files = True
+ print("need_split_files: {}".format(need_split_files))
+ if need_split_files:
files = split_files(files, context["fleet"].worker_index(),
context["fleet"].worker_num())
+
print("file_list : {}".format(files))
reader = reader_class(yaml_file)
@@ -81,10 +93,20 @@ def slotdataloader_by_name(readerclass, dataset_name, yaml_file, context):
data_path = os.path.join(package_base, data_path.split("::")[1])
files = [str(data_path) + "/%s" % x for x in os.listdir(data_path)]
+ files.sort()
+
+ need_split_files = False
if context["engine"] == EngineMode.LOCAL_CLUSTER:
+ # for local cluster: split files for multi process
+ need_split_files = True
+ elif context["engine"] == EngineMode.CLUSTER and context[
+ "cluster_type"] == "K8S":
+ # for k8s mount mode, split files for every node
+ need_split_files = True
+
+ if need_split_files:
files = split_files(files, context["fleet"].worker_index(),
context["fleet"].worker_num())
- print("file_list: {}".format(files))
sparse = get_global_env(name + "sparse_slots", "#")
if sparse == "":
@@ -135,10 +157,20 @@ def slotdataloader(readerclass, train, yaml_file, context):
data_path = os.path.join(package_base, data_path.split("::")[1])
files = [str(data_path) + "/%s" % x for x in os.listdir(data_path)]
+ files.sort()
+
+ need_split_files = False
if context["engine"] == EngineMode.LOCAL_CLUSTER:
+ # for local cluster: split files for multi process
+ need_split_files = True
+ elif context["engine"] == EngineMode.CLUSTER and context[
+ "cluster_type"] == "K8S":
+ # for k8s mount mode, split files for every node
+ need_split_files = True
+
+ if need_split_files:
files = split_files(files, context["fleet"].worker_index(),
context["fleet"].worker_num())
- print("file_list: {}".format(files))
sparse = get_global_env("sparse_slots", "#", namespace)
if sparse == "":
diff --git a/doc/custom_reader.md b/doc/custom_reader.md
deleted file mode 100644
index c9079b5397057f35191bd376d22e978806e6c646..0000000000000000000000000000000000000000
--- a/doc/custom_reader.md
+++ /dev/null
@@ -1,362 +0,0 @@
-# PaddleRec 自定义数据集及Reader
-
-用户自定义数据集及配置异步Reader,需要关注以下几个步骤:
-
-* [数据集整理](#数据集整理)
-* [在模型组网中加入输入占位符](#在模型组网中加入输入占位符)
-* [Reader实现](#Reader的实现)
-* [在yaml文件中配置Reader](#在yaml文件中配置reader)
-
-我们以CTR-DNN模型为例,给出了从数据整理,变量定义,Reader写法,调试的完整历程。
-
-* [数据及Reader示例-DNN](#数据及Reader示例-DNN)
-
-
-## 数据集整理
-
-PaddleRec支持模型自定义数据集。
-
-关于数据的tips:
-1. 数据量:
-
- PaddleRec面向大规模数据设计,可以轻松支持亿级的数据读取,工业级的数据读写api:`dataset`在搜索、推荐、信息流等业务得到了充分打磨。
-2. 文件类型:
-
- 支持任意直接可读的文本数据,`dataset`同时支持`.gz`格式的文本压缩数据,无需额外代码,可直接读取。数据样本应以`\n`为标志,按行组织。
-
-3. 文件存放位置:
-
- 文件通常存放在训练节点本地,但同时,`dataset`支持使用`hadoop`远程读取数据,数据无需下载到本地,为dataset配置hadoop相关账户及地址即可。
-4. 数据类型
-
- Reader处理的是以行为单位的`string`数据,喂入网络的数据需要转为`int`,`float`的数值数据,不支持`string`喂入网络,不建议明文保存及处理训练数据。
-5. Tips
-
- Dataset模式下,训练线程与数据读取线程的关系强相关,为了多线程充分利用,`强烈建议将文件合理的拆为多个小文件`,尤其是在分布式训练场景下,可以均衡各个节点的数据量,同时加快数据的下载速度。
-
-## 在模型组网中加入输入占位符
-
-Reader读取文件后,产出的数据喂入网络,需要有占位符进行接收。占位符在Paddle中使用`fluid.data`或`fluid.layers.data`进行定义。`data`的定义可以参考[fluid.data](https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/fluid_cn/data_cn.html#data)以及[fluid.layers.data](https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/layers_cn/data_cn.html#data)。
-
-假如您希望输入三个数据,分别是维度32的数据A,维度变长的稀疏数据B,以及一个一维的标签数据C,并希望梯度可以经过该变量向前传递,则示例如下:
-
-数据A的定义:
-```python
-var_a = fluid.data(name='A', shape= [-1, 32], dtype='float32')
-```
-
-数据B的定义,变长数据的使用可以参考[LoDTensor](https://www.paddlepaddle.org.cn/documentation/docs/zh/beginners_guide/basic_concept/lod_tensor.html#cn-user-guide-lod-tensor):
-```python
-var_b = fluid.data(name='B', shape=[-1, 1], lod_level=1, dtype='int64')
-```
-
-数据C的定义:
-```python
-var_c = fluid.data(name='C', shape=[-1, 1], dtype='int32')
-var_c.stop_gradient = False
-```
-
-当我们完成以上三个数据的定义后,在PaddleRec的模型定义中,还需将其加入model基类成员变量`self._data_var`
-
-```python
-self._data_var.append(var_a)
-self._data_var.append(var_b)
-self._data_var.append(var_c)
-```
-至此,我们完成了在组网中定义输入数据的工作。
-
-## Reader的实现
-
-### Reader的实现范式
-
-Reader的逻辑需要一个单独的python文件进行描述。我们试写一个`test_reader.py`,实现的具体流程如下:
-1. 首先我们需要引入Reader基类
-
- ```python
- from paddlerec.core.reader import ReaderBase
- ```
-2. 创建一个子类,继承Reader的基类,训练所需Reader命名为`TrainerReader`
- ```python
- class TrainerReader(ReaderBase):
- def init(self):
- pass
-
- def generator_sample(self, line):
- pass
- ```
-
-3. 在`init(self)`函数中声明一些在数据读取中会用到的变量,必要时可以在`config.yaml`文件中配置变量,利用`env.get_global_env()`拿到。
-
- 比如,我们希望从yaml文件中读取一个数据预处理变量`avg=10`,目的是将数据A的数据缩小10倍,可以这样实现:
-
- 首先更改yaml文件,在某个space下加入该变量
-
- ```yaml
- ...
- train:
- reader:
- avg: 10
- ...
- ```
-
-
- 再更改Reader的init函数
-
- ```python
- from paddlerec.core.utils import envs
- class TrainerReader(Reader):
- def init(self):
- self.avg = envs.get_global_env("avg", None, "train.reader")
-
- def generator_sample(self, line):
- pass
- ```
-
-4. 继承并实现基类中的`generate_sample(self, line)`函数,逐行读取数据。
- - 该函数应返回一个可以迭代的reader方法(带有yield的函数不再是一个普通的函数,而是一个生成器generator,成为了可以迭代的对象,等价于一个数组、链表、文件、字符串etc.)
- - 在这个可以迭代的函数中,如示例代码中的`def reader()`,我们定义数据读取的逻辑。以行为单位的数据进行截取,转换及预处理。
- - 最后,我们需要将数据整理为特定的格式,才能够被PaddleRec的Reader正确读取,并灌入的训练的网络中。简单来说,数据的输出顺序与我们在网络中创建的`inputs`必须是严格一一对应的,并转换为类似字典的形式。
-
- 示例: 假设数据ABC在文本数据中,每行以这样的形式存储:
- ```shell
- 0.1,0.2,0.3...3.0,3.1,3.2 \t 99999,99998,99997 \t 1 \n
- ```
-
- 则示例代码如下:
- ```python
- from paddlerec.core.utils import envs
- class TrainerReader(Reader):
- def init(self):
- self.avg = envs.get_global_env("avg", None, "train.reader")
-
- def generator_sample(self, line):
-
- def reader(self, line):
- # 先分割 '\n', 再以 '\t'为标志分割为list
- variables = (line.strip('\n')).split('\t')
-
- # A是第一个元素,并且每个数据之间使用','分割
- var_a = variables[0].split(',') # list
- var_a = [float(i) / self.avg for i in var_a] # 将str数据转换为float
-
-
- # B是第二个元素,同样以 ',' 分割
- var_b = variables[1].split(',') # list
- var_b = [int(i) for i in var_b] # 将str数据转换为int
-
- # C是第三个元素, 只有一个元素,没有分割符
- var_c = variables[2]
- var_c = int(var_c) # 将str数据转换为int
- var_c = [var_c] # 将单独的数据元素置入list中
-
- # 将数据与数据名结合,组织为dict的形式
- # 如下,output形式为{ A: var_a, B: var_b, C: var_c}
- variable_name = ['A', 'B', 'C']
- output = zip(variable_name, [var_a] + [var_b] + [var_c])
-
- # 将数据输出,使用yield方法,将该函数变为了一个可迭代的对象
- yield output
-
- ```
-
- 至此,我们完成了Reader的实现。
-
-
-### 在yaml文件中配置Reader
-
-在模型的yaml配置文件中,主要的修改是三个,如下
-
-```yaml
-reader:
- batch_size: 2
- class: "{workspace}/reader.py"
- train_data_path: "{workspace}/data/train_data"
- reader_debug_mode: False
-```
-
-batch_size: 顾名思义,是小批量训练时的样本大小
-class: 运行改模型所需reader的路径
-train_data_path: 训练数据所在文件夹
-reader_debug_mode: 测试reader语法,及输出是否符合预期的debug模式的开关
-
-
-## 数据及Reader示例-DNN
-
-Reader代码来源于[criteo_reader.py](../models/rank/criteo_reader.py), 组网代码来源于[model.py](../models/rank/dnn/model.py)
-
-### Criteo数据集格式
-
-CTR-DNN训练及测试数据集选用[Display Advertising Challenge](https://www.kaggle.com/c/criteo-display-ad-challenge/)所用的Criteo数据集。该数据集包括两部分:训练集和测试集。训练集包含一段时间内Criteo的部分流量,测试集则对应训练数据后一天的广告点击流量。
-每一行数据格式如下所示:
-```bash
- ... ...
-```
-其中``````表示广告是否被点击,点击用1表示,未点击用0表示。``````代表数值特征(连续特征),共有13个连续特征。``````代表分类特征(离散特征),共有26个离散特征。相邻两个特征用```\t```分隔,缺失特征用空格表示。测试集中``````特征已被移除。
-
-### Criteo数据集的预处理
-
-数据预处理共包括两步:
-- 将原始训练集按9:1划分为训练集和验证集
-- 数值特征(连续特征)需进行归一化处理,但需要注意的是,对每一个特征``````,归一化时用到的最大值并不是用全局最大值,而是取排序后95%位置处的特征值作为最大值,同时保留极值。
-
-### CTR网络输入的定义
-
-正如前所述,Criteo数据集中,分为连续数据与离散(稀疏)数据,所以整体而言,CTR-DNN模型的数据输入层包括三个,分别是:`dense_input`用于输入连续数据,维度由超参数`dense_feature_dim`指定,数据类型是归一化后的浮点型数据。`sparse_input_ids`用于记录离散数据,在Criteo数据集中,共有26个slot,所以我们创建了名为`C1~C26`的26个稀疏参数输入,并设置`lod_level=1`,代表其为变长数据,数据类型为整数;最后是每条样本的`label`,代表了是否被点击,数据类型是整数,0代表负样例,1代表正样例。
-
-在Paddle中数据输入的声明使用`paddle.fluid.layers.data()`,会创建指定类型的占位符,数据IO会依据此定义进行数据的输入。
-
-稀疏参数输入的定义:
-```python
-def sparse_inputs():
- ids = envs.get_global_env("hyper_parameters.sparse_inputs_slots", None)
-
- sparse_input_ids = [
- fluid.layers.data(name="S" + str(i),
- shape=[1],
- lod_level=1,
- dtype="int64") for i in range(1, ids)
- ]
- return sparse_input_ids
-```
-
-稠密参数输入的定义:
-```python
-def dense_input():
- dim = envs.get_global_env("hyper_parameters.dense_input_dim", None)
-
- dense_input_var = fluid.layers.data(name="D",
- shape=[dim],
- dtype="float32")
- return dense_input_var
-```
-
-标签的定义:
-```python
-def label_input():
- label = fluid.layers.data(name="click", shape=[1], dtype="int64")
- return label
-```
-
-组合起来,正确的声明他们:
-```python
-self.sparse_inputs = sparse_inputs()
-self.dense_input = dense_input()
-self.label_input = label_input()
-
-self._data_var.append(self.dense_input)
-
-for input in self.sparse_inputs:
- self._data_var.append(input)
-
-self._data_var.append(self.label_input)
-
-```
-
-
-### Criteo Reader写法
-
-```python
-# 引入PaddleRec的Reader基类
-from paddlerec.core.reader import ReaderBase
-# 引入PaddleRec的读取yaml配置文件的方法
-from paddlerec.core.utils import envs
-
-# 定义TrainReader,需要继承 paddlerec.core.reader.Reader
-class Reader(ReaderBase)::
-
- # 数据预处理逻辑,继承自基类
- # 如果无需处理, 使用pass跳过该函数的执行
- def init(self):
- self.cont_min_ = [0, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
- self.cont_max_ = [20, 600, 100, 50, 64000, 500, 100, 50, 500, 10, 10, 10, 50]
- self.cont_diff_ = [20, 603, 100, 50, 64000, 500, 100, 50, 500, 10, 10, 10, 50]
- self.hash_dim_ = envs.get_global_env("hyper_parameters.sparse_feature_number", None, "train.model")
- self.continuous_range_ = range(1, 14)
- self.categorical_range_ = range(14, 40)
-
- # 读取数据方法,继承自基类
- # 实现可以迭代的reader函数,逐行处理数据
- def generate_sample(self, line):
- """
- Read the data line by line and process it as a dictionary
- """
-
- def reader():
- """
- This function needs to be implemented by the user, based on data format
- """
- features = line.rstrip('\n').split('\t')
-
- dense_feature = []
- sparse_feature = []
- for idx in self.continuous_range_:
- if features[idx] == "":
- dense_feature.append(0.0)
- else:
- dense_feature.append(
- (float(features[idx]) - self.cont_min_[idx - 1]) /
- self.cont_diff_[idx - 1])
-
- for idx in self.categorical_range_:
- sparse_feature.append(
- [hash(str(idx) + features[idx]) % self.hash_dim_])
- label = [int(features[0])]
- feature_name = ["D"]
- for idx in self.categorical_range_:
- feature_name.append("S" + str(idx - 13))
- feature_name.append("label")
- yield zip(feature_name, [dense_feature] + sparse_feature + [label])
-
- return reader
-```
-
-
-### 调试Reader
-
-在Linux下运行时,默认启动`Dataset`模式,在Win/Mac下运行时,默认启动`Dataloader`模式。
-
-通过在`config.yaml`中添加或修改`reader_debug_mode=True`打开debug模式,只会结合组网运行reader的部分,读取10条样本,并print,方便您观察格式是否符合预期或隐藏bug。
-```yaml
-reader:
- batch_size: 2
- class: "{workspace}/../criteo_reader.py"
- train_data_path: "{workspace}/data/train"
- reader_debug_mode: True
-```
-
-修改后,使用paddlerec.run执行该修改后的yaml文件,可以观察输出。
-```bash
-python -m paddlerec.run -m ./models/rank/dnn/config.yaml -e single
-```
-
-### Dataset调试
-
-dataset输出的数据格式如下:
-` dense_input:size ; dense_input:value ; sparse_input:size ; sparse_input:value ; ... ; sparse_input:size ; sparse_input:value ; label:size ; label:value `
-
-基本规律是对于每个变量,会先输出其维度大小,再输出其具体值。
-
-直接debug `criteo_reader`理想的输出为(截取了一个片段):
-```bash
-...
-13 0.0 0.00497512437811 0.05 0.08 0.207421875 0.028 0.35 0.08 0.082 0.0 0.4 0.0 0.08 1 737395 1 210498 1 903564 1 286224 1 286835 1 906818 1 90
-6116 1 67180 1 27346 1 51086 1 142177 1 95024 1 157883 1 873363 1 600281 1 812592 1 228085 1 35900 1 880474 1 984402 1 100885 1 26235 1 410878 1 798162 1 499868 1 306163 1 0
-...
-```
-可以看到首先输出的是13维的dense参数,随后是分立的sparse参数,最后一个是1维的label,数值为0,输出符合预期。
-
->使用Dataset的一些注意事项
-> - Dataset的基本原理:将数据print到缓存,再由C++端的代码实现读取,因此,我们不能在dataset的读取代码中,加入与数据读取无关的print信息,会导致C++端拿到错误的数据信息。
-> - dataset目前只支持在`unbuntu`及`CentOS`等标准Linux环境下使用,在`Windows`及`Mac`下使用时,会产生预料之外的错误,请知悉。
-
-### DataLoader调试
-
-dataloader的输出格式为`list: [ list[var_1], list[var_2], ... , list[var_3]]`,每条样本的数据会被放在一个 **list[list]** 中,list[0]为第一个variable。
-
-直接debug `criteo_reader`理想的输出为(截取了一个片段):
-```bash
-...
-[[0.0, 0.004975124378109453, 0.05, 0.08, 0.207421875, 0.028, 0.35, 0.08, 0.082, 0.0, 0.4, 0.0, 0.08], [560746], [902436], [262029], [182633], [368411], [735166], [321120], [39572], [185732], [140298], [926671], [81559], [461249], [728372], [915018], [907965], [818961], [850958], [311492], [980340], [254960], [175041], [524857], [764893], [526288], [220126], [0]]
-...
-```
-可以看到首先输出的是13维的dense参数的list,随后是分立的sparse参数,各自在一个list中,最后一个是1维的label的list,数值为0,输出符合预期。
diff --git a/doc/distributed_train.md b/doc/distributed_train.md
index 59a22bf258e91eefdab315bfcaca67416e5eef89..41d5c260d37e89222064febcff8dea861a05a9ce 100644
--- a/doc/distributed_train.md
+++ b/doc/distributed_train.md
@@ -9,6 +9,7 @@
- [第三步:增加集群运行`backend.yaml`配置](#第三步增加集群运行backendyaml配置)
- [MPI集群的Parameter Server模式配置](#mpi集群的parameter-server模式配置)
- [K8S集群的Collective模式配置](#k8s集群的collective模式配置)
+ - [K8S集群的PS-CPU模式配置](#k8s集群的ps-cpu模式配置)
- [第四步:任务提交](#第四步任务提交)
- [使用PaddleCloud Client提交](#使用paddlecloud-client提交)
- [第一步:在`before_hook.sh`里手动安装PaddleRec](#第一步在before_hooksh里手动安装paddlerec)
@@ -34,10 +35,10 @@
分布式运行首先需要更改`config.yaml`,主要调整以下内容:
-- workspace: 调整为在节点运行时的工作目录
-- runner_class: 从单机的"train"调整为"cluster_train"
-- fleet_mode: 选则参数服务器模式,抑或GPU Collective模式
-- distribute_strategy: 可选项,选择分布式训练的策略
+- workspace: 调整为在远程节点运行时的工作目录,一般设置为`"./"`即可
+- runner_class: 从单机的"train"调整为"cluster_train",单机训练->分布式训练(例外情况,k8s上单机单卡训练仍然为train,后续支持)
+- fleet_mode: 选择参数服务器模式(ps),或者GPU的all-reduce模式(collective)
+- distribute_strategy: 可选项,选择分布式训练的策略,目前只在参数服务器模式下生效,可选项:`sync、asycn、half_async、geo`
配置选项具体参数,可以参考[yaml配置说明](./yaml.md)
@@ -47,50 +48,72 @@
```yaml
# workspace
-workspace: "paddlerec.models.rank.dnn"
+workspace: "models/rank/dnn"
mode: [single_cpu_train]
-# config of each runner.
-# runner is a kind of paddle training class, which wraps the train/infer process.
runner:
- name: single_cpu_train
class: train
- # num of epochs
epochs: 4
- # device to run training or infer
device: cpu
- save_checkpoint_interval: 2 # save model interval of epochs
- save_checkpoint_path: "increment_dnn" # save checkpoint path
- init_model_path: "" # load model path
+ save_checkpoint_interval: 2
+ save_checkpoint_path: "increment_dnn"
+ init_model_path: ""
print_interval: 10
phases: [phase1]
+
+dataset:
+- name: dataloader_train
+ batch_size: 2
+ type: DataLoader
+ data_path: "{workspace}/data/sample_data/train"
+ sparse_slots: "click 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26"
+ dense_slots: "dense_var:13"
+
+phase:
+- name: phase1
+ model: "{workspace}/model.py"
+ dataset_name: dataloader_train
+ thread_num: 1
```
分布式的训练配置可以改为:
```yaml
-# workspace
-# 改变一:代码上传至节点后,与运行shell同在一个默认目录下
+# 改变一:代码上传至节点后,在默认目录下
workspace: "./"
mode: [ps_cluster]
-# config of each runner.
-# runner is a kind of paddle training class, which wraps the train/infer process.
runner:
- name: ps_cluster
# 改变二:调整runner的class
class: cluster_train
- # num of epochs
epochs: 4
- # device to run training or infer
device: cpu
# 改变三 & 四: 指定fleet_mode 与 distribute_strategy
fleet_mode: ps
distribute_strategy: async
- save_checkpoint_interval: 2 # save model interval of epochs
- save_checkpoint_path: "increment_dnn" # save checkpoint path
- init_model_path: "" # load model path
+ save_checkpoint_interval: 2
+ save_checkpoint_path: "increment_dnn"
+ init_model_path: ""
print_interval: 10
phases: [phase1]
+
+dataset:
+- name: dataloader_train
+ batch_size: 2
+ type: DataLoader
+ # 改变五: 改变数据的读取目录
+ # 通常而言,mpi模式下,数据会下载到远程节点执行目录的'./train_data'下, k8s则与挂载位置有关
+ data_path: "{workspace}/train_data"
+ sparse_slots: "click 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26"
+ dense_slots: "dense_var:13"
+
+phase:
+- name: phase1
+ model: "{workspace}/model.py"
+ dataset_name: dataloader_train
+ # 分布式训练节点的CPU_NUM环境变量与thread_num相等,多个phase时,取最大的thread_num
+ thread_num: 1
```
除此之外,还需关注数据及模型加载的路径,一般而言:
@@ -110,6 +133,8 @@ cluster_type: mpi # k8s 可选
config:
# 填写任务运行的paddle官方版本号 >= 1.7.2, 默认1.7.2
paddle_version: "1.7.2"
+ # 是否使用PaddleCloud运行环境下的Python3,默认使用python2
+ use_python3: 1
# hdfs/afs的配置信息填写
fs_name: "afs://xxx.com"
@@ -130,11 +155,13 @@ config:
# paddle参数服务器分布式底层超参,无特殊需求不理不改
communicator:
+ # 使用SGD优化器时,建议设置为1
FLAGS_communicator_is_sgd_optimizer: 0
+ # 以下三个变量默认都等于训练时的线程数:CPU_NUM
FLAGS_communicator_send_queue_size: 5
- FLAGS_communicator_thread_pool_size: 32
FLAGS_communicator_max_merge_var_num: 5
FLAGS_communicator_max_send_grad_num_before_recv: 5
+ FLAGS_communicator_thread_pool_size: 32
FLAGS_communicator_fake_rpc: 0
FLAGS_rpc_retry_times: 3
@@ -165,7 +192,14 @@ submit:
# for k8s gpu
# k8s gpu 模式下,训练节点数,及每个节点上的GPU卡数
k8s_trainers: 2
+ k8s_cpu_cores: 4
k8s_gpu_card: 1
+
+ # for k8s ps-cpu
+ k8s_trainers: 2
+ k8s_cpu_cores: 4
+ k8s_ps_num: 2
+ k8s_ps_cores: 4
```
@@ -173,18 +207,51 @@ submit:
除此之外,我们还需要关注上传到工作目录的文件(`files选项`)的路径问题,在示例中是`./*.py`,说明我们执行任务提交时,与这些py文件在同一目录。若不在同一目录,则需要适当调整files路径,或改为这些文件的绝对路径。
-不建议利用`files`上传数据文件,可以通过指定`train_data_path`自动下载,或指定`afs_remote_mount_point`挂载实现数据到节点的转移。
+不建议利用`files`上传过大的数据文件,可以通过指定`train_data_path`自动下载,或在k8s模式下指定`afs_remote_mount_point`挂载实现数据到节点的转移。
#### MPI集群的Parameter Server模式配置
下面是一个利用PaddleCloud提交MPI参数服务器模式任务的`backend.yaml`示例
+首先调整`config.yaml`:
+```yaml
+workspace: "./"
+mode: [ps_cluster]
+
+dataset:
+- name: dataloader_train
+ batch_size: 2
+ type: DataLoader
+ data_path: "{workspace}/train_data"
+ sparse_slots: "click 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26"
+ dense_slots: "dense_var:13"
+
+runner:
+- name: ps_cluster
+ class: cluster_train
+ epochs: 2
+ device: cpu
+ fleet_mode: ps
+ save_checkpoint_interval: 1
+ save_checkpoint_path: "increment_dnn"
+ init_model_path: ""
+ print_interval: 1
+ phases: [phase1]
+
+phase:
+- name: phase1
+ model: "{workspace}/model.py"
+ dataset_name: dataloader_train
+ thread_num: 1
+```
+
+
+再新增`backend.yaml`
```yaml
backend: "PaddleCloud"
-cluster_type: mpi # k8s 可选
+cluster_type: mpi # k8s可选
config:
- # 填写任务运行的paddle官方版本号 >= 1.7.2, 默认1.7.2
paddle_version: "1.7.2"
# hdfs/afs的配置信息填写
@@ -229,9 +296,45 @@ submit:
下面是一个利用PaddleCloud提交K8S集群进行GPU训练的`backend.yaml`示例
+首先调整`config.yaml`
+
+```yaml
+workspace: "./"
+mode: [collective_cluster]
+
+dataset:
+- name: dataloader_train
+ batch_size: 2
+ type: DataLoader
+ data_path: "{workspace}/afs/挂载数据文件夹的路径"
+ sparse_slots: "click 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26"
+ dense_slots: "dense_var:13"
+
+runner:
+- name: collective_cluster
+ class: cluster_train
+ epochs: 2
+ device: gpu
+ fleet_mode: collective
+ save_checkpoint_interval: 1 # save model interval of epochs
+ save_checkpoint_path: "increment_dnn" # save checkpoint path
+ init_model_path: "" # load model path
+ print_interval: 1
+ phases: [phase1]
+
+phase:
+- name: phase1
+ model: "{workspace}/model.py"
+ dataset_name: dataloader_train
+ thread_num: 1
+```
+
+
+再增加`backend.yaml`
+
```yaml
backend: "PaddleCloud"
-cluster_type: mpi # k8s 可选
+cluster_type: k8s # mpi 可选
config:
# 填写任务运行的paddle官方版本号 >= 1.7.2, 默认1.7.2
@@ -271,9 +374,93 @@ submit:
# for k8s gpu
# k8s gpu 模式下,训练节点数,及每个节点上的GPU卡数
k8s_trainers: 2
+ k8s_cpu_cores: 4
k8s_gpu_card: 1
```
+#### K8S集群的PS-CPU模式配置
+下面是一个利用PaddleCloud提交K8S集群进行参数服务器CPU训练的`backend.yaml`示例
+
+首先调整`config.yaml`:
+```yaml
+workspace: "./"
+mode: [ps_cluster]
+
+dataset:
+- name: dataloader_train
+ batch_size: 2
+ type: DataLoader
+ data_path: "{workspace}/afs/挂载数据文件夹的路径"
+ sparse_slots: "click 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26"
+ dense_slots: "dense_var:13"
+
+runner:
+- name: ps_cluster
+ class: cluster_train
+ epochs: 2
+ device: cpu
+ fleet_mode: ps
+ save_checkpoint_interval: 1
+ save_checkpoint_path: "increment_dnn"
+ init_model_path: ""
+ print_interval: 1
+ phases: [phase1]
+
+phase:
+- name: phase1
+ model: "{workspace}/model.py"
+ dataset_name: dataloader_train
+ thread_num: 1
+```
+
+再新增`backend.yaml`
+```yaml
+backend: "PaddleCloud"
+cluster_type: k8s # mpi 可选
+
+config:
+ # 填写任务运行的paddle官方版本号 >= 1.7.2, 默认1.7.2
+ paddle_version: "1.7.2"
+
+ # hdfs/afs的配置信息填写
+ fs_name: "afs://xxx.com"
+ fs_ugi: "usr,pwd"
+
+ # 填任务输出目录的远程地址,如afs:/user/your/path/ 则此处填 /user/your/path
+ output_path: ""
+
+ # for k8s
+ # 填远程挂载地址,如afs:/user/your/path/ 则此处填 /user/your/path
+ afs_remote_mount_point: ""
+
+submit:
+ # PaddleCloud 个人信息 AK 及 SK
+ ak: ""
+ sk: ""
+
+ # 任务运行优先级,默认high
+ priority: "high"
+
+ # 任务名称
+ job_name: "PaddleRec_CTR"
+
+ # 训练资源所在组
+ group: ""
+
+ # 节点上的任务启动命令
+ start_cmd: "python -m paddlerec.run -m ./config.yaml"
+
+ # 本地需要上传到节点工作目录的文件
+ files: ./*.py ./*.yaml
+
+ # for k8s gpu
+ # k8s ps-cpu 模式下,训练节点数,参数服务器节点数,及每个节点上的cpu核心数及内存限制
+ k8s_trainers: 2
+ k8s_cpu_cores: 4
+ k8s_ps_num: 2
+ k8s_ps_cores: 4
+```
+
### 第四步:任务提交
当我们准备好`config.yaml`与`backend.yaml`,便可以进行一键任务提交,命令为:
diff --git a/doc/metrics.md b/doc/metrics.md
new file mode 100644
index 0000000000000000000000000000000000000000..32efa0224023cd020c7b4ffd809d4dd55c808e4e
--- /dev/null
+++ b/doc/metrics.md
@@ -0,0 +1,124 @@
+# 如何给模型增加Metric
+
+## PaddleRec Metric使用示例
+```
+from paddlerec.core.model import ModelBase
+from paddlerec.core.metrics import RecallK
+
+class Model(ModelBase):
+ def __init__(self, config):
+ ModelBase.__init__(self, config)
+
+ def net(self, inputs, is_infer=False):
+ ...
+ acc = RecallK(input=logits, label=label, k=20)
+ self._metrics["Train_P@20"] = acc
+```
+## Metric类
+### 成员变量
+> _global_metric_state_vars(dict),
+字典类型,用以存储metric计算过程中需要的中间状态变量。一般情况下,这些中间状态需要是Persistable=True的变量,所以会在模型保存的时候也会被保存下来。因此infer阶段需手动将这些中间状态值清零,进而保证预测结果的正确性。
+
+### 成员函数
+> clear(self, scope):
+从scope中将self._global_metric_state_vars中的状态值全清零。该函数一般用在**infer**阶段开始的时候。用以保证预测指标的正确性。
+
+> calc_global_metrics(self, fleet, scope=None):
+将self._global_metric_state_vars中的状态值在所有训练节点上做all_reduce操作,进而下一步调用_calculate()函数计算全局指标。若fleet=None,则all_reduce的结果为自己本身,即单机全局指标计算。
+
+> get_result(self): 返回训练过程中需要fetch,并定期打印至屏幕的变量。返回类型为dict。
+
+## Metrics
+### AUC
+> AUC(input ,label, curve='ROC', num_thresholds=2**12 - 1, topk=1, slide_steps=1)
+
+Auc,全称Area Under the Curve(AUC),该层根据前向输出和标签计算AUC,在二分类(binary classification)估计中广泛使用。在二分类(binary classification)中广泛使用。相关定义参考 https://en.wikipedia.org/wiki/Receiver_operating_characteristic#Area_under_the_curve 。
+
+#### 参数
+- **input(Tensor|LoDTensor)**: 数据类型为float32,float64。浮点二维变量。输入为网络的预测值。shape为[batch_size, 2]。
+- **label(Tensor|LoDTensor)**: 数据类型为int64,int32。输入为数据集的标签。shape为[batch_size, 1]。
+- **curve(str)**: 曲线类型,可以为 ROC 或 PR,默认 ROC。
+- **num_thresholds(int)**: 将roc曲线离散化时使用的临界值数。默认200。
+- **topk(int)**: 取topk的输出值用于计算。
+- **slide_steps(int)**: - 当计算batch auc时,不仅用当前步也用于先前步。slide_steps=1,表示用当前步;slide_steps = 3表示用当前步和前两步;slide_steps = 0,则用所有步。
+
+#### 返回值
+该指标训练过程中定期的变量有两个:
+- **AUC**: 整体AUC值
+- **BATCH_AUC**:当前batch的AUC值
+
+
+### PrecisionRecall
+> PrecisionRecall(input, label, class_num)
+
+计算precison, recall, f1。
+
+#### 参数
+- **input(Tensor|LoDTensor)**: 数据类型为float32,float64。输入为网络的预测值。shape为[batch_size, class_num]
+- **label(Tensor|LoDTensor)**: 数据类型为int32。输入为数据集的标签。shape为 [batch_size, 1]
+- **class_num(int)**: 类别个数。
+
+#### 返回值
+- **[TP FP TN FN]**: 形状为[class_num, 4]的变量,用以表征每种类型的TP,FP,TN和FN值。TP=true positive, FP=false positive, TN=true negative, FN=false negative。若需计算每种类型的precison, recall,f1, 则可根据如下公式进行计算:
+precision = TP / (TP + FP); recall = TP = TP / (TP + FN); F1 = 2 * precision * recall / (precision + recall)。
+
+- **precision_recall_f1**: 形状为[6],分别代表[macro_avg_precision, macro_avg_recall, macro_avg_f1, micro_avg_precision, micro_avg_recall, micro_avg_f1],这里macro代表先计算每种类型的准确率,召回率,F1,然后求平均。micro代表先计算所有类型的整体TP,TN, FP, FN等中间值,然后在计算准确率,召回率,F1.
+
+
+### RecallK
+> RecallK(input, label, k=20)
+
+TopK的召回准确率,对于任意一条样本来说,若前top_k个分类结果中包含正确分类标签,则视为正样本。
+
+#### 参数
+- **input(Tensor|LoDTensor)**: 数据类型为float32,float64。输入为网络的预测值。shape为[batch_size, class_dim]
+- **label(Tensor|LoDTensor)**: 数据类型为int64,int32。输入为数据集的标签。shape为 [batch_size, 1]
+- **k(int)**: 取每个类别中top_k个预测值用于计算召回准确率。
+
+#### 返回值
+- **InsCnt**:样本总数
+- **RecallCnt**: topk可以正确被召回的样本数
+- **Acc(Recall@k)**: RecallCnt/InsCnt,即Topk召回准确率。
+
+## PairWise_PN
+> PosNegRatio(pos_score, neg_score)
+
+正逆序指标,一般用在输入是pairwise的模型中。例如输入既包含正样本,也包含负样本,模型需要去学习最大化正负样本打分的差异。
+
+#### 参数
+- **pos_score(Tensor|LoDTensor)**: 正样本的打分,数据类型为float32,float64。浮点二维变量,值的范围为[0,1]。
+- **neg_score(Tensor|LoDTensor)**:负样本的打分。数据类型为float32,float64。浮点二维变量,值的范围为[0,1]。
+
+#### 返回值
+- **RightCnt**: pos_score > neg_score的样本数
+- **WrongCnt**: pos_score <= neg_score的样本数
+- **PN**: (RightCnt + 1.0) / (WrongCnt + 1.0), 正逆序,+1.0是为了避免除0错误。
+
+### Customized_Metric
+如果你需要在自定义metric,那么你需要按如下步骤操作:
+1. 继承paddlerec.core.Metric,定义你的MyMetric类。
+2. 在MyMetric的构造函数中,自定义Metric组网,声明self._global_metric_state_vars私有变量。
+3. 定义_calculate(global_metrics),全局指标计算。该函数的输入globla_metrics,存储了self._global_metric_state_vars中所有中间状态变量的全局统计值。最终结果以str格式返回。
+
+自定义Metric模版如下,你可以参考注释,或paddlerec.core.metrics下已经实现的precision_recall, auc, pairwise_pn, recall_k等指标的计算方式,自定义自己的Metric类。
+```
+from paddlerec.core.Metric import Metric
+
+class MyMetric(Metric):
+ def __init__(self):
+ # 1. 自定义Metric组网
+ ** 1. your code **
+
+ # 2. 设置中间状态字典
+ self._global_metric_state_vars = dict()
+ ** 2. your code **
+
+ def get_result(self):
+ # 3. 定义训练过程中需要打印的变量,以字典格式返回
+ self. _metrics = dict()
+ ** 3. your code **
+
+ def _calculate(self, global_metrics):
+ # 4. 全局指标计算,global_metrics为字典类型,存储了self._global_metric_state_vars中所有中间状态变量的全局统计值。返回格式为str。
+ ** your code **
+```
diff --git a/doc/model_develop.md b/doc/model_develop.md
index da9523fac2e20258cd488f61ca07900772f5ce78..2594cccf56503d3277b73603b8f8ffeda5e16da9 100644
--- a/doc/model_develop.md
+++ b/doc/model_develop.md
@@ -92,7 +92,7 @@ def input_data(self, is_infer=False, **kwargs):
return train_inputs
```
-更多数据读取教程,请参考[自定义数据集及Reader](custom_dataset_reader.md)
+更多数据读取教程,请参考[自定义数据集及Reader](custom_reader.md)
### 组网的定义
@@ -113,6 +113,8 @@ def input_data(self, is_infer=False, **kwargs):
可以参考官方模型的示例学习net的构造方法。
+除可以使用Paddle的Metrics接口外,PaddleRec也统一封装了一些常见的Metrics评价指标,并允许开发者定义自己的Metrics类,相关文件参考[Metrics开发文档](metrics.md)。
+
## 如何运行自定义模型
记录`model.py`,`config.yaml`及数据读取`reader.py`的文件路径,建议置于同一文件夹下,如`/home/custom_model`下,更改`config.yaml`中的配置选项
diff --git a/doc/pre_train_model.md b/doc/pre_train_model.md
new file mode 100644
index 0000000000000000000000000000000000000000..134710a430992cc756cd37fcc1e01ee3aef2dfb1
--- /dev/null
+++ b/doc/pre_train_model.md
@@ -0,0 +1,15 @@
+# PaddleRec 预训练模型
+
+PaddleRec基于业务实践,使用真实数据,产出了推荐领域算法的若干预训练模型,方便开发者进行算法调研。
+
+## 文本分类预训练模型
+
+### 获取地址
+
+```bash
+wget xxx.tar.gz
+```
+
+### 使用方法
+
+解压后,得到的是一个paddle的模型文件夹,使用`PaddleRec/models/contentunderstanding/classification_finetue`模型进行加载
diff --git a/doc/train.md b/doc/train.md
index f54f80ae701fd71d4898c47147fdd073ad82998a..16fad1b23783b5fe0c2a785f5500ba88c42ae356 100644
--- a/doc/train.md
+++ b/doc/train.md
@@ -20,7 +20,7 @@ python -m paddlerec.run -m paddlerec.models.xxx.yyy
例如启动`recall`下的`word2vec`模型的默认配置;
```shell
-python -m paddlerec.run -m paddlerec.models.recall.word2vec
+python -m paddlerec.run -m models/recall/word2vec
```
### 2. 启动内置模型的个性化配置训练
diff --git a/doc/yaml.md b/doc/yaml.md
index 4d08ef72253b5fa1371faa5890c53ba32c0ca2e6..c96b3ee47ad56872d5d85fa6d674887ca083cf82 100644
--- a/doc/yaml.md
+++ b/doc/yaml.md
@@ -1,4 +1,4 @@
-# PaddleRec yaml配置说明
+# PaddleRec config.yaml配置说明
## 全局变量
@@ -12,31 +12,31 @@
## runner变量
-| 名称 | 类型 | 取值 | 是否必须 | 作用描述 |
-| :---------------------------: | :----------: | :-------------------------------------------: | :------: | :------------------------------------------------------------------: |
-| name | string | 任意 | 是 | 指定runner名称 |
+| 名称 | 类型 | 取值 | 是否必须 | 作用描述 |
+| :---------------------------: | :----------: | :-------------------------------------------------------: | :------: | :------------------------------------------------------------------: |
+| name | string | 任意 | 是 | 指定runner名称 |
| class | string | train(默认) / infer / local_cluster_train / cluster_train | 是 | 指定运行runner的类别(单机/分布式, 训练/预测) |
-| device | string | cpu(默认) / gpu | 否 | 程序执行设备 |
-| fleet_mode | string | ps(默认) / pslib / collective | 否 | 分布式运行模式 |
-| selected_gpus | string | "0"(默认) | 否 | 程序运行GPU卡号,若以"0,1"的方式指定多卡,则会默认启用collective模式 |
-| worker_num | int | 1(默认) | 否 | 参数服务器模式下worker的数量 |
-| server_num | int | 1(默认) | 否 | 参数服务器模式下server的数量 |
-| distribute_strategy | string | async(默认)/sync/half_async/geo | 否 | 参数服务器模式下训练模式的选择 |
-| epochs | int | >= 1 | 否 | 模型训练迭代轮数 |
-| phases | list[string] | 由phase name组成的list | 否 | 当前runner的训练过程列表,顺序执行 |
-| init_model_path | string | 路径 | 否 | 初始化模型地址 |
-| save_checkpoint_interval | int | >= 1 | 否 | Save参数的轮数间隔 |
-| save_checkpoint_path | string | 路径 | 否 | Save参数的地址 |
-| save_inference_interval | int | >= 1 | 否 | Save预测模型的轮数间隔 |
-| save_inference_path | string | 路径 | 否 | Save预测模型的地址 |
-| save_inference_feed_varnames | list[string] | 组网中指定Variable的name | 否 | 预测模型的入口变量name |
-| save_inference_fetch_varnames | list[string] | 组网中指定Variable的name | 否 | 预测模型的出口变量name |
-| print_interval | int | >= 1 | 否 | 训练指标打印batch间隔 |
-| instance_class_path | string | 路径 | 否 | 自定义instance流程实现的地址 |
-| network_class_path | string | 路径 | 否 | 自定义network流程实现的地址 |
-| startup_class_path | string | 路径 | 否 | 自定义startup流程实现的地址 |
-| runner_class_path | string | 路径 | 否 | 自定义runner流程实现的地址 |
-| terminal_class_path | string | 路径 | 否 | 自定义terminal流程实现的地址 |
+| device | string | cpu(默认) / gpu | 否 | 程序执行设备 |
+| fleet_mode | string | ps(默认) / pslib / collective | 否 | 分布式运行模式 |
+| selected_gpus | string | "0"(默认) | 否 | 程序运行GPU卡号,若以"0,1"的方式指定多卡,则会默认启用collective模式 |
+| worker_num | int | 1(默认) | 否 | 参数服务器模式下worker的数量 |
+| server_num | int | 1(默认) | 否 | 参数服务器模式下server的数量 |
+| distribute_strategy | string | async(默认)/sync/half_async/geo | 否 | 参数服务器模式下训练模式的选择 |
+| epochs | int | >= 1 | 否 | 模型训练迭代轮数 |
+| phases | list[string] | 由phase name组成的list | 否 | 当前runner的训练过程列表,顺序执行 |
+| init_model_path | string | 路径 | 否 | 初始化模型地址 |
+| save_checkpoint_interval | int | >= 1 | 否 | Save参数的轮数间隔 |
+| save_checkpoint_path | string | 路径 | 否 | Save参数的地址 |
+| save_inference_interval | int | >= 1 | 否 | Save预测模型的轮数间隔 |
+| save_inference_path | string | 路径 | 否 | Save预测模型的地址 |
+| save_inference_feed_varnames | list[string] | 组网中指定Variable的name | 否 | 预测模型的入口变量name |
+| save_inference_fetch_varnames | list[string] | 组网中指定Variable的name | 否 | 预测模型的出口变量name |
+| print_interval | int | >= 1 | 否 | 训练指标打印batch间隔 |
+| instance_class_path | string | 路径 | 否 | 自定义instance流程实现的地址 |
+| network_class_path | string | 路径 | 否 | 自定义network流程实现的地址 |
+| startup_class_path | string | 路径 | 否 | 自定义startup流程实现的地址 |
+| runner_class_path | string | 路径 | 否 | 自定义runner流程实现的地址 |
+| terminal_class_path | string | 路径 | 否 | 自定义terminal流程实现的地址 |
@@ -70,3 +70,55 @@
| optimizer.learning_rate | float | > 0 | 否 | 指定学习率 |
| reg | float | > 0 | 否 | L2正则化参数,只在SGD下生效 |
| others | / | / | / | 由各个模型组网独立指定 |
+
+
+# PaddleRec backend.yaml配置说明
+
+## 全局变量
+
+ | 名称 | 类型 | 取值 | 是否必须 | 作用描述 |
+ | :----------: | :----: | :-------------: | :------: | :----------------------------------------------: |
+ | backend | string | paddlecloud/k8s | 是 | 使用PaddleCloud平台提交,还是在公有云K8S集群提交 |
+ | cluster_type | string | mpi/k8s | 是 | 指定运行的计算集群: mpi 还是 k8s |
+
+ ## config
+ | 名称 | 类型 | 取值 | 是否必须 | 作用描述 |
+ | :--------------------: | :----: | :-------------------------------------: | :------: | :------------------------------------------------------------------------------------------: |
+ | paddle_version | string | paddle官方版本号,如1.7.2/1.8.0/1.8.3等 | 否 | 指定运行训练使用的Paddle版本,默认1.7.2 |
+ | use_python3 | int | 0(默认)/1 | 否 | 指定是否使用python3进行训练 |
+ | fs_name | string | "afs://xxx.com" | 是 | hdfs/afs集群名称所需配置 |
+ | fs_ugi | string | "usr,pwd" | 是 | hdfs/afs集群密钥所需配置 |
+ | output_path | string | "/user/your/path" | 否 | 任务输出的远程目录 |
+ | train_data_path | string | "/user/your/path" | 是 | mpi集群下指定训练数据路径,paddlecloud会自动将数据分片并下载到工作目录的`./train_data`文件夹 |
+ | test_data_path | string | "/user/your/path" | 否 | mpi集群下指定测试数据路径,会自动下载到工作目录的`./test_data`文件夹 |
+ | thirdparty_path | string | "/user/your/path" | 否 | mpi集群下指定thirdparty路径,会自动下载到工作目录的`./thirdparty`文件夹 |
+ | afs_remote_mount_point | string | "/user/your/path" | 是 | k8s集群下指定远程路径的地址,会挂载到工作目录的`./afs/下` |
+
+ ### config.communicator
+ | 名称 | 类型 | 取值 | 是否必须 | 作用描述 |
+ | :----------------------------------------------: | :---: | :------------: | :------: | :----------------------------------------------------: |
+ | FLAGS_communicator_is_sgd_optimizer | int | 0(默认)/1 | 否 | 异步分布式训练时的多线程的梯度融合方式是否使用SGD模式 |
+ | FLAGS_communicator_send_queue_size | int | 线程数(默认) | 否 | 分布式训练时发送队列的大小 |
+ | FLAGS_communicator_max_merge_var_num | int | 线程数(默认) | 否 | 分布式训练多线程梯度融合时,线程数的配置 |
+ | FLAGS_communicator_max_send_grad_num_before_recv | int | 线程数(默认) | 否 | 分布式训练使用独立recv参数线程时,与send的步调配置超参 |
+ | FLAGS_communicator_thread_pool_size | int | 32(默认) | 否 | 分布式训练时,多线程发送参数的线程池大小 |
+ | FLAGS_communicator_fake_rpc | int | 0(默认)/1 | 否 | 分布式训练时,选择不进行通信 |
+ | FLAGS_rpc_retry_times | int | 3(默认) | 否 | 分布式训练时,GRPC的失败重试次数 |
+
+
+## submit
+| 名称 | 类型 | 取值 | 是否必须 | 作用描述 |
+| :-----------: | :----: | :-------------------------: | :------: | :------------------------------------------------------: |
+| ak | string | PaddleCloud平台提供的ak密钥 | 是 | paddlecloud用户配置 |
+| sk | string | PaddleCloud平台提供的sk密钥 | 否 | paddlecloud用户配置 |
+| priority | string | normal/high/very_high | 否 | 任务优先级 |
+| job_name | string | 任意 | 是 | 任务名称 |
+| group | string | 计算资源所在组名称 | 是 | 组名称 |
+| start_cmd | string | 任意 | 是 | 启动命令,默认`python -m paddlerec.run -m ./config.yaml` |
+| files | string | 任意 | 是 | 随任务提交上传的文件,给出相对或绝对路径 |
+| nodes | int | >=1(默认1) | 否 | mpi集群下的节点数 |
+| k8s_trainers | int | >=1(默认1) | 否 | k8s集群下worker的节点数 |
+| k8s_cpu_cores | int | >=1(默认1) | 否 | k8s集群下worker的CPU核数 |
+| k8s_gpu_card | int | >=1(默认1) | 否 | k8s集群下worker的GPU卡数 |
+| k8s_ps_num | int | >=1(默认1) | 否 | k8s集群下server的节点数 |
+| k8s_ps_cores | int | >=1(默认1) | 否 | k8s集群下server的CPU核数 |
diff --git a/models/contentunderstanding/classification/config.yaml b/models/contentunderstanding/classification/config.yaml
index 3d1d387a6700edb3a322463e267045d9c2ff2e28..0b76646d3ee2ecbcbb5a93d34726679e1761b4c6 100644
--- a/models/contentunderstanding/classification/config.yaml
+++ b/models/contentunderstanding/classification/config.yaml
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-workspace: "paddlerec.models.contentunderstanding.classification"
+workspace: "models/contentunderstanding/classification"
dataset:
- name: data1
diff --git a/models/contentunderstanding/readme.md b/models/contentunderstanding/readme.md
index 59bddb165dac77825d8f98ff51ac95b1a091dc1a..ba63b620886c5a9346b1e5bb9d69e0aa15336df9 100644
--- a/models/contentunderstanding/readme.md
+++ b/models/contentunderstanding/readme.md
@@ -39,8 +39,11 @@
##使用教程(快速开始)
```
-python -m paddlerec.run -m paddlerec.models.contentunderstanding.tagspace
-python -m paddlerec.run -m paddlerec.models.contentunderstanding.classification
+git clone https://github.com/PaddlePaddle/PaddleRec.git paddle-rec
+cd paddle-rec
+
+python -m paddlerec.run -m models/contentunderstanding/tagspace/config.yaml
+python -m paddlerec.run -m models/contentunderstanding/classification/config.yaml
```
## 使用教程(复现论文)
diff --git a/models/contentunderstanding/tagspace/config.yaml b/models/contentunderstanding/tagspace/config.yaml
index 3ac1e5c7866628a1abcf3216c12b392b4fe0d358..84c9ac82e5d427d9433499b030cf9d372086c2cb 100644
--- a/models/contentunderstanding/tagspace/config.yaml
+++ b/models/contentunderstanding/tagspace/config.yaml
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-workspace: "paddlerec.models.contentunderstanding.tagspace"
+workspace: "models/contentunderstanding/tagspace"
dataset:
- name: sample_1
diff --git a/models/demo/movie_recommand/rank/config.yaml b/models/demo/movie_recommand/rank/config.yaml
index 94e7b0f1aec4759ebabf238b832ebe0110a0ea8c..e5834178a98e7132fc85ed25f4a2a509dc979e9c 100644
--- a/models/demo/movie_recommand/rank/config.yaml
+++ b/models/demo/movie_recommand/rank/config.yaml
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-workspace: "paddlerec.models.demo.movie_recommand"
+workspace: "models/demo/movie_recommand"
# list of dataset
dataset:
diff --git a/models/demo/movie_recommand/recall/config.yaml b/models/demo/movie_recommand/recall/config.yaml
index 4b683c1ccecffc81b792c40fbe450979ad5a6ffb..63ca1c9c42cc232c4873578991b4534f1aa5f325 100644
--- a/models/demo/movie_recommand/recall/config.yaml
+++ b/models/demo/movie_recommand/recall/config.yaml
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-workspace: "paddlerec.models.demo.movie_recommand"
+workspace: "models/demo/movie_recommand"
# list of dataset
dataset:
diff --git a/models/match/dssm/config.yaml b/models/match/dssm/config.yaml
index 8f97c496739d820d37fd6878ef5ddb669b671ad7..6c0d61a2676a57f400647a1bcdc9ca6d8d6fdb1e 100755
--- a/models/match/dssm/config.yaml
+++ b/models/match/dssm/config.yaml
@@ -13,7 +13,7 @@
# limitations under the License.
-workspace: "paddlerec.models.match.dssm"
+workspace: "models/match/dssm"
dataset:
- name: dataset_train
diff --git a/models/match/match-pyramid/__init__.py b/models/match/match-pyramid/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..abf198b97e6e818e1fbe59006f98492640bcee54
--- /dev/null
+++ b/models/match/match-pyramid/__init__.py
@@ -0,0 +1,13 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
diff --git a/models/match/match-pyramid/config.yaml b/models/match/match-pyramid/config.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..ec1c0e1c41bcaf133482b20e77d6a6ca6cfa299d
--- /dev/null
+++ b/models/match/match-pyramid/config.yaml
@@ -0,0 +1,89 @@
+# Copyrigh t(c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
+
+
+workspace: "models/match/match-pyramid"
+
+dataset:
+- name: dataset_train
+ batch_size: 128
+ type: DataLoader
+ data_path: "{workspace}/data/train"
+ data_converter: "{workspace}/train_reader.py"
+- name: dataset_infer
+ batch_size: 1
+ type: DataLoader
+ data_path: "{workspace}/data/test"
+ data_converter: "{workspace}/test_reader.py"
+
+
+hyper_parameters:
+ optimizer:
+ class: adam
+ learning_rate: 0.001
+ strategy: async
+ emb_path: "./data/embedding.npy"
+ sentence_left_size: 20
+ sentence_right_size: 500
+ vocab_size: 193368
+ emb_size: 50
+ kernel_num: 8
+ hidden_size: 20
+ hidden_act: "relu"
+ out_size: 1
+ channels: 1
+ conv_filter: [2,10]
+ conv_act: "relu"
+ pool_size: [6,50]
+ pool_stride: [6,50]
+ pool_type: "max"
+ pool_padding: "VALID"
+
+mode: [train_runner , infer_runner]
+# config of each runner.
+# runner is a kind of paddle training class, which wraps the train/infer process.
+runner:
+- name: train_runner
+ class: train
+ # num of epochs
+ epochs: 2
+ # device to run training or infer
+ device: cpu
+ save_checkpoint_interval: 1 # save model interval of epochs
+ save_inference_interval: 1 # save inference
+ save_checkpoint_path: "inference" # save checkpoint path
+ save_inference_path: "inference" # save inference path
+ save_inference_feed_varnames: [] # feed vars of save inference
+ save_inference_fetch_varnames: [] # fetch vars of save inference
+ init_model_path: "" # load model path
+ print_interval: 2
+ phases: phase_train
+- name: infer_runner
+ class: infer
+ # device to run training or infer
+ device: cpu
+ print_interval: 1
+ init_model_path: "inference/1" # load model path
+ phases: phase_infer
+
+# runner will run all the phase in each epoch
+phase:
+- name: phase_train
+ model: "{workspace}/model.py" # user-defined model
+ dataset_name: dataset_train # select dataset by name
+ thread_num: 1
+- name: phase_infer
+ model: "{workspace}/model.py" # user-defined model
+ dataset_name: dataset_infer # select dataset by name
+ thread_num: 1
diff --git a/models/match/match-pyramid/data/process.py b/models/match/match-pyramid/data/process.py
new file mode 100644
index 0000000000000000000000000000000000000000..7be9d1fbb236150cf8dfd00e700b8cfd9f247aa2
--- /dev/null
+++ b/models/match/match-pyramid/data/process.py
@@ -0,0 +1,152 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
+
+import os
+import numpy as np
+import random
+
+
+# Read Word Dict and Inverse Word Dict
+def read_word_dict(filename):
+ word_dict = {}
+ for line in open(filename):
+ line = line.strip().split()
+ word_dict[int(line[1])] = line[0]
+ print('[%s]\n\tWord dict size: %d' % (filename, len(word_dict)))
+ return word_dict
+
+
+# Read Embedding File
+def read_embedding(filename):
+ embed = {}
+ for line in open(filename):
+ line = line.strip().split()
+ embed[int(line[0])] = list(map(float, line[1:]))
+ print('[%s]\n\tEmbedding size: %d' % (filename, len(embed)))
+ return embed
+
+
+# Convert Embedding Dict 2 numpy array
+def convert_embed_2_numpy(embed_dict, embed=None):
+ for k in embed_dict:
+ embed[k] = np.array(embed_dict[k])
+ print('Generate numpy embed:', embed.shape)
+ return embed
+
+
+# Read Data
+def read_data(filename):
+ data = {}
+ for line in open(filename):
+ line = line.strip().split()
+ data[line[0]] = list(map(int, line[2:]))
+ print('[%s]\n\tData size: %s' % (filename, len(data)))
+ return data
+
+
+# Read Relation Data
+def read_relation(filename):
+ data = []
+ for line in open(filename):
+ line = line.strip().split()
+ data.append((int(line[0]), line[1], line[2]))
+ print('[%s]\n\tInstance size: %s' % (filename, len(data)))
+ return data
+
+
+Letor07Path = "./data"
+word_dict = read_word_dict(filename=os.path.join(Letor07Path, 'word_dict.txt'))
+query_data = read_data(filename=os.path.join(Letor07Path, 'qid_query.txt'))
+doc_data = read_data(filename=os.path.join(Letor07Path, 'docid_doc.txt'))
+embed_dict = read_embedding(filename=os.path.join(Letor07Path,
+ 'embed_wiki-pdc_d50_norm'))
+
+_PAD_ = len(word_dict) #193367
+embed_dict[_PAD_] = np.zeros((50, ), dtype=np.float32)
+word_dict[_PAD_] = '[PAD]'
+W_init_embed = np.float32(np.random.uniform(-0.02, 0.02, [len(word_dict), 50]))
+embedding = convert_embed_2_numpy(embed_dict, embed=W_init_embed)
+np.save("embedding.npy", embedding)
+
+batch_size = 64
+data1_maxlen = 20
+data2_maxlen = 500
+embed_size = 50
+train_iters = 2500
+
+
+def make_train():
+ rel_set = {}
+ pair_list = []
+ rel = read_relation(filename=os.path.join(Letor07Path,
+ 'relation.train.fold1.txt'))
+ for label, d1, d2 in rel:
+ if d1 not in rel_set:
+ rel_set[d1] = {}
+ if label not in rel_set[d1]:
+ rel_set[d1][label] = []
+ rel_set[d1][label].append(d2)
+ for d1 in rel_set:
+ label_list = sorted(rel_set[d1].keys(), reverse=True)
+ for hidx, high_label in enumerate(label_list[:-1]):
+ for low_label in label_list[hidx + 1:]:
+ for high_d2 in rel_set[d1][high_label]:
+ for low_d2 in rel_set[d1][low_label]:
+ pair_list.append((d1, high_d2, low_d2))
+ print('Pair Instance Count:', len(pair_list))
+
+ f = open("./data/train/train.txt", "w")
+ for batch in range(800):
+ X1 = np.zeros((batch_size * 2, data1_maxlen), dtype=np.int32)
+ X2 = np.zeros((batch_size * 2, data2_maxlen), dtype=np.int32)
+ X1[:] = _PAD_
+ X2[:] = _PAD_
+ for i in range(batch_size):
+ d1, d2p, d2n = random.choice(pair_list)
+ d1_len = min(data1_maxlen, len(query_data[d1]))
+ d2p_len = min(data2_maxlen, len(doc_data[d2p]))
+ d2n_len = min(data2_maxlen, len(doc_data[d2n]))
+ X1[i, :d1_len] = query_data[d1][:d1_len]
+ X2[i, :d2p_len] = doc_data[d2p][:d2p_len]
+ X1[i + batch_size, :d1_len] = query_data[d1][:d1_len]
+ X2[i + batch_size, :d2n_len] = doc_data[d2n][:d2n_len]
+ for i in range(batch_size * 2):
+ q = [str(x) for x in list(X1[i])]
+ d = [str(x) for x in list(X2[i])]
+ f.write(",".join(q) + "\t" + ",".join(d) + "\n")
+ f.close()
+
+
+def make_test():
+ rel = read_relation(filename=os.path.join(Letor07Path,
+ 'relation.test.fold1.txt'))
+ f = open("./data/test/test.txt", "w")
+ for label, d1, d2 in rel:
+ X1 = np.zeros(data1_maxlen, dtype=np.int32)
+ X2 = np.zeros(data2_maxlen, dtype=np.int32)
+ X1[:] = _PAD_
+ X2[:] = _PAD_
+ d1_len = min(data1_maxlen, len(query_data[d1]))
+ d2_len = min(data2_maxlen, len(doc_data[d2]))
+ X1[:d1_len] = query_data[d1][:d1_len]
+ X2[:d2_len] = doc_data[d2][:d2_len]
+ q = [str(x) for x in list(X1)]
+ d = [str(x) for x in list(X2)]
+ f.write(",".join(q) + "\t" + ",".join(d) + "\t" + str(label) + "\t" +
+ d1 + "\n")
+ f.close()
+
+
+make_train()
+make_test()
diff --git a/models/match/match-pyramid/data/relation.test.fold1.txt b/models/match/match-pyramid/data/relation.test.fold1.txt
new file mode 100644
index 0000000000000000000000000000000000000000..eaf3c9c44ad20fe1d609aa33a70c23c9fb21401e
--- /dev/null
+++ b/models/match/match-pyramid/data/relation.test.fold1.txt
@@ -0,0 +1,256 @@
+2 9639 GX099-60-3149248
+1 9639 GX028-47-6554966
+1 9639 GX031-84-2802741
+1 9639 GX031-86-1702683
+1 9639 GX031-89-11392170
+1 9639 GX035-46-10142187
+1 9639 GX039-07-1333080
+1 9639 GX040-05-15096071
+1 9639 GX045-35-10693225
+1 9639 GX045-74-6226888
+1 9639 GX046-31-8871083
+1 9639 GX046-56-6274894
+1 9639 GX050-09-14629105
+1 9639 GX097-05-12714275
+1 9639 GX101-06-7768196
+1 9639 GX124-50-4934142
+1 9639 GX259-01-13320140
+1 9639 GX259-50-8109630
+1 9639 GX259-72-16176934
+1 9639 GX259-98-7821925
+1 9639 GX260-27-13260880
+1 9639 GX260-54-6363694
+1 9639 GX260-78-6999656
+1 9639 GX261-04-0843988
+1 9639 GX261-23-4964814
+0 9639 GX021-75-7026755
+0 9639 GX021-80-16449591
+0 9639 GX025-40-7135810
+0 9639 GX031-89-9020252
+0 9639 GX037-45-0533209
+0 9639 GX038-17-11223353
+0 9639 GX057-07-13335832
+0 9639 GX081-50-12756687
+0 9639 GX124-43-2364716
+0 9639 GX129-60-0000000
+0 9639 GX219-07-7475581
+0 9639 GX233-90-7976935
+0 9639 GX267-49-2983064
+0 9639 GX267-74-2413254
+0 9639 GX270-05-13614294
+1 9329 GX234-05-0812081
+0 9329 GX000-00-0000000
+0 9329 GX008-50-3899336
+0 9329 GX011-75-8470249
+0 9329 GX020-42-13388867
+0 9329 GX024-91-8520306
+0 9329 GX026-88-6087429
+0 9329 GX027-22-1703847
+0 9329 GX034-11-2617393
+0 9329 GX036-02-7994497
+0 9329 GX046-08-13858054
+0 9329 GX059-85-11403109
+0 9329 GX099-37-0232298
+0 9329 GX099-46-11473306
+0 9329 GX108-04-9589788
+0 9329 GX110-50-11723940
+0 9329 GX124-11-4119164
+0 9329 GX149-82-15204191
+0 9329 GX165-95-6198495
+0 9329 GX225-56-4184936
+0 9329 GX229-57-4487470
+0 9329 GX230-37-4125963
+0 9329 GX231-40-14574318
+0 9329 GX238-44-10302536
+0 9329 GX239-85-8572461
+0 9329 GX244-17-10154048
+0 9329 GX245-16-4169590
+0 9329 GX245-46-6341859
+0 9329 GX246-91-8487173
+0 9329 GX262-88-13259441
+0 9329 GX263-41-4135561
+0 9329 GX264-07-6385713
+0 9329 GX264-38-12253757
+0 9329 GX264-90-15990025
+0 9329 GX265-89-6212449
+0 9329 GX268-41-12034794
+0 9329 GX268-83-5140660
+0 9329 GX270-46-0293828
+0 9329 GX270-64-11852140
+0 9329 GX271-10-12458597
+2 9326 GX272-03-6610348
+1 9326 GX011-12-0595978
+0 9326 GX000-00-0000000
+0 9326 GX000-38-9492606
+0 9326 GX000-84-4587136
+0 9326 GX002-41-5566464
+0 9326 GX002-51-2615036
+0 9326 GX004-56-12238694
+0 9326 GX004-72-2476906
+0 9326 GX008-13-1835206
+0 9326 GX008-64-7705528
+0 9326 GX009-87-0976731
+0 9326 GX012-24-7688369
+0 9326 GX012-96-8727608
+0 9326 GX023-87-16736657
+0 9326 GX025-21-11820239
+0 9326 GX025-22-15113698
+0 9326 GX025-51-13959128
+0 9326 GX025-57-11414648
+0 9326 GX025-64-7587631
+0 9326 GX027-62-4542881
+0 9326 GX031-25-4759403
+0 9326 GX036-10-7902858
+0 9326 GX047-04-9457544
+0 9326 GX047-06-4014803
+0 9326 GX048-00-15113058
+0 9326 GX048-02-12975919
+0 9326 GX048-78-3273874
+0 9326 GX235-35-0963257
+0 9326 GX235-98-3789570
+0 9326 GX236-51-15473637
+0 9326 GX237-96-0892713
+0 9326 GX239-35-7413891
+0 9326 GX239-95-0176537
+0 9326 GX251-34-10377030
+0 9326 GX254-19-11374782
+0 9326 GX260-63-10533444
+0 9326 GX265-94-14886230
+0 9326 GX269-78-1500497
+0 9326 GX270-59-10270517
+2 8946 GX046-79-6984659
+2 8946 GX148-33-1869479
+2 8946 GX252-36-12638222
+1 8946 GX017-47-13290921
+1 8946 GX030-69-3218092
+1 8946 GX034-82-4550348
+1 8946 GX044-01-9283107
+1 8946 GX047-98-6660623
+1 8946 GX057-96-12580825
+1 8946 GX059-94-12068143
+1 8946 GX060-13-13600036
+1 8946 GX060-74-6594973
+1 8946 GX093-08-1158999
+0 8946 GX000-00-0000000
+0 8946 GX000-42-15811803
+0 8946 GX000-81-16418910
+0 8946 GX008-38-10557859
+0 8946 GX011-01-10891808
+0 8946 GX013-71-5708874
+0 8946 GX015-72-4458924
+0 8946 GX023-91-9869060
+0 8946 GX027-56-6376748
+0 8946 GX037-11-10829529
+0 8946 GX038-55-0681330
+0 8946 GX043-86-4200105
+0 8946 GX047-52-3712485
+0 8946 GX053-77-4836617
+0 8946 GX070-62-1070063
+0 8946 GX105-53-13372327
+0 8946 GX218-61-6263172
+0 8946 GX223-72-13625320
+0 8946 GX230-68-14727182
+0 8946 GX235-34-7733230
+0 8946 GX251-73-0159347
+0 8946 GX254-47-1098586
+0 8946 GX263-76-6934681
+0 8946 GX263-84-8668756
+0 8946 GX264-70-14223639
+0 8946 GX269-12-5910753
+0 8946 GX271-93-9895614
+1 9747 GX006-77-1973537
+1 9747 GX244-83-8716953
+1 9747 GX269-92-7189826
+0 9747 GX000-00-0000000
+0 9747 GX001-51-8693413
+0 9747 GX003-10-2820641
+0 9747 GX003-74-0557776
+0 9747 GX003-79-13695689
+0 9747 GX009-57-0938999
+0 9747 GX009-59-8595527
+0 9747 GX009-80-10629348
+0 9747 GX010-37-0206372
+0 9747 GX013-46-2187318
+0 9747 GX014-58-4004859
+0 9747 GX015-79-5393654
+0 9747 GX032-50-7316370
+0 9747 GX049-33-2206612
+0 9747 GX050-34-0439256
+0 9747 GX062-76-0914936
+0 9747 GX065-73-7392661
+0 9747 GX148-27-15770966
+0 9747 GX155-71-0504939
+0 9747 GX229-75-14750078
+0 9747 GX231-01-0640962
+0 9747 GX236-45-15598812
+0 9747 GX247-19-9516715
+0 9747 GX247-34-4277646
+0 9747 GX247-63-10766287
+0 9747 GX248-23-15998266
+0 9747 GX249-85-9742193
+0 9747 GX250-31-7671617
+0 9747 GX252-56-2141580
+0 9747 GX253-15-3406713
+0 9747 GX264-07-15838087
+0 9747 GX264-43-6543997
+0 9747 GX266-18-14688076
+0 9747 GX267-50-2036010
+0 9747 GX268-28-0548507
+0 9747 GX269-49-14171555
+0 9747 GX269-63-15607386
+2 9740 GX005-94-14208849
+2 9740 GX008-51-5639660
+2 9740 GX012-37-2342061
+2 9740 GX019-75-13916532
+2 9740 GX074-76-16261807
+2 9740 GX077-07-2951943
+2 9740 GX229-28-11068981
+2 9740 GX237-80-7497206
+2 9740 GX257-53-10589749
+2 9740 GX258-06-0611419
+2 9740 GX268-55-9791226
+1 9740 GX007-62-1126118
+1 9740 GX015-78-0216468
+1 9740 GX038-65-1678199
+1 9740 GX041-25-14803324
+1 9740 GX063-71-0401425
+1 9740 GX077-08-15801730
+1 9740 GX098-07-2885671
+1 9740 GX135-28-6485892
+1 9740 GX228-85-10518518
+1 9740 GX231-93-11279468
+1 9740 GX234-70-15061254
+1 9740 GX236-31-11149347
+1 9740 GX240-68-1184464
+1 9740 GX248-03-7275316
+1 9740 GX253-11-9846012
+1 9740 GX255-05-10638500
+1 9740 GX267-73-4450097
+1 9740 GX269-19-0642640
+0 9740 GX001-74-5132048
+0 9740 GX001-88-2603815
+0 9740 GX004-83-7935833
+0 9740 GX007-01-16750210
+0 9740 GX040-11-5249209
+0 9740 GX042-38-2886005
+0 9740 GX052-20-4359789
+0 9740 GX067-74-3718011
+0 9740 GX077-01-13481396
+0 9740 GX242-92-8868913
+0 9740 GX262-74-4596688
+2 8835 GX010-99-5715419
+2 8835 GX049-99-2518724
+0 8835 GX000-00-0000000
+0 8835 GX007-91-6779497
+0 8835 GX008-14-0788708
+0 8835 GX008-15-13942125
+0 8835 GX011-58-14336551
+0 8835 GX012-79-10684001
+0 8835 GX013-00-10822427
+0 8835 GX013-03-5962783
+0 8835 GX015-54-0251701
+0 8835 GX017-36-5859317
+0 8835 GX017-60-0601078
+0 8835 GX027-24-16202205
+0 8835 GX030-11-15814183
+0 8835 GX030-76-11969233
diff --git a/models/match/match-pyramid/data/test/test.txt b/models/match/match-pyramid/data/test/test.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ac8f0a1021b17bd586f4df611132b32ad98fff8c
--- /dev/null
+++ b/models/match/match-pyramid/data/test/test.txt
@@ -0,0 +1,128 @@
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1588,2392,343,91,934,1716,16,1716,1693,555,50,2794,3927,4314,711,1693,26878,22265,1588,993,717,1693,1594,2082,660,2566,1716,934,1588,259,1882,1588,54453,23197,17715,3043,3421,1897,5412,1563,4374,3581,2392,343,91,1882,1588,13061,1908,1734,2273,319,13907,5356,11632,14911,1588,15982,6636,10147,3539,1079,319,2968,1588,5474,1079,319,2029,420,3684,3256,20703,298,3094,14568,3030,437,443,10087,10063,1079,1588,4234,935,1588,2029,535,2273,319,3605,26778,5870,1720,4406,535,2029,1588,2470,1079,319,163,5438,1079,3710,21926,827,4098,3808,3030,1882,1588,3334,7052,929,2890,2392,1329,3581,764,1588,1588,967,5480,1563,3758,1882,1588,414,5356,2363,12270,10014,14667,27310,3848,975,92730,21341,1882,1588,54453,23197,2392,795,7052,1581,91,3737,91,1921,3737,14875,1588,11347,6679,16206,12944,4345,1956,6167,5901,91,1921,1882,1588,3330,4257,4593,4388,3234,4374,1716,6613,23868,1079,6649,2392,53872,259,5942,214,2656,1588,54453,54454,22474,2316,229,435,2392,343,91,2656,26756,10330,4098,442,437,3808,1391,3862,1354,2656,9460,4406,1065,192,3122,2888,2656,1588,214,3808,3421,27011,98,2392,1354,1329,3260,343,91,452,602,1588,7205,1937,10306,3737,4349,1588,2992,435,3532,2939,1079,2439,3808,1588,1969,21341,975,6530,1882,1588,21215,2982,4083,4406,27011,233,4428,10339,17194,420,3110,52851,1079,1882,1588,869,6636,1079,378,2029,4406,3421,1897,7574,2119,5588,319,867,2029,4608,27373,18030,571,63227,319,867,3823,1588,4805,1079,1588,686,7170,3018,1882,1588,214,4432,2853,179,96,1752,4392,1588,46,329,1006,1588,349,2392,3018,5952,1882,1588,91,4432,330,2316,1882,1588,2392,1882,1663,2316,2902,1540,1720,24341,4194,1540,945,14658,1663,6344,1882,1882,1588,3674,2050,435,705,2479,9,10,1463,4922,1882,1588,1882,21629,2316,3834,1391,2392,1882,1588,2185,239,975,21098,22937,21341,3834,253,1978,2392,1588,3644,253,3603,1588,764,3637,4262,2185,2996,1588,604,2029,4262,4113,802,4609,1588,604,2949,9072,3666,1265,319,867,2749,438,604,1317,5343,109,2392,1882,1588,1816,8854,112,456,3010,604,1720,8854,1978,1588,349,225,1882,1588,7347,2392,4063,8854,1588,7322,50666,2792,33,521,194,5480,1882,1588,414,2967,943,3758,1265,2949,802,9072,1588,7205,4059,4091,13907,3674,578,392,4735,1588,13632,319,2968,11632,2909,321,4374,14415,1816,1588,3601,1039,600,319,1563,3758,4485,3068,6355,2363,12270,5356,27112,14667,3848,13959,3063,1882,1588,3808,2149,82,32508,3808,13185,233,4419,2547,2853,1882,1588,530,14911,4529,3234,1588,67068,802,9072,4609,7347,385,1588,567,3049,7034,3322,975 2 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1335,3304,2392,343,91,343,91,452,393,4470,2392,343,91,3962,1221,2322,3223,3224,2392,45,3158,21341,2814,63526,1335,1501,3207,2392,343,91,1335,3304,4016,7310,3304,2392,343,91,3261,6715,1588,6362,2392,343,91,5936,3261,3856,1588,929,223,5248,2890,602,4543,1588,46,2392,1588,929,3532,287,1960,1079,1588,6362,6362,3761,1588,1566,44372,420,6362,1712,437,443,378,1588,1588,1856,1079,319,2739,3339,650,2439,1588,1079,1588,6362,3882,3424,6362,2392,1588,3696,3453,4543,1588,491,5232,1730,1079,1588,6690,2392,1588,3696,3970,343,91,452,464,2168,610,91,2896,2392,2886,2742,531,1766,2392,3696,2058,5960,2522,1079,1588,4805,602,2273,46,1882,1588,2392,343,91,3696,2906,207,223,6715,1143,6362,287,1960,6697,8277,91,3737,464,6611,1588,4406,3284,1674,319,2392,343,91,1588,3297,319,184,52964,4822,2967,2968,3737,1111,3284,1674,319,1588,929,1601,44087,784,5360,1694,1588,3783,2992,435,20703,535,3582,397,420,91,1588,2994,3033,660,1588,420,91,6693,1079,1816,343,91,452,1693,452,343,1693,397,355,85432,1693,2321,3071,38670,252,1008,3568,6340,1588,643,2220,3668,1693,1214,11198,1008,91,643,2220,1588,4113,2992,435,1693,5547,3807,5360,1588,1588,1856,1079,319,378,443,1079,437,7181,4638,91,5547,4543,46,1588,6362,2392,846,3928,2029,2890,1694,2699,4543,46,1588,4406,3889,3737,3793,91,1214,3628,2273,420,1588,2392,192,763,3266,456,1327,1588,91,1566,44372,420,1588,25686,1566,5141,5438,420,1827,2633,1588,4882,3808,633,3696,4274,3859,2522,21135,340,2392,3035,378,1563,128,91,2953,376,730,543,4944,6171,4511,1139,10834,445,1139,1407,3786,4511,3879,3659,1139,1407,7538,1975,1139,2392,1588,3696,3261,2906,271,1601,3768,271,870,1588,929,287,1960,2890,7385,6479,4603,7440,6636,1588,46,293,7199,420,1837,2392,343,91,1588,929,5227,3216,3158,21341,2814,63526,1335,1828,2423,475,1280,21341,6127,259,343,91,452,2366,2974,3281,259,764,6127,4866,2392,343,91,1335,2176,3215,3158,21341,2814,63526,1335,3729,3496,4144,4297,2392,343,91,1043,1921,3158,21341,2814,63526,1335,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1335,3304,2392,343,91,343,91,452,393,4470,2392,343,91,3962,1221,2322,3223,3224,2392,45,3158,21341,2814,63526,1335,1501,3207,2392,343,91,1335,3304,2046,7310,3304,39057,2392,343,91,1588,2998,1265,2392,343,91,47282,14121,4091,12392,756,410,17133,1693,2998,2392,1882,1588,4543,1588,491,2392,287,2400,6697,2967,1761,2997,2522,1143,1079,1588,6362,349,91,1079,1588,6362,23649,6715,5009,104,734,437,443,2522,2168,6715,3261,3856,223,3622,2392,3737,2865,319,1674,3284,91,319,14143,2235,1674,1105,2769,1588,52964,319,14143,2235,980,633,10170,5159,633,91,1588,2560,1588,2888,7594,633,1856,319,1588,5039,4822,5152,4402,3281,567,2392,343,91,21320,4822,2316,2889,4247,216,1588,1079,319,21320,5935,10525,386,5080,355,2392,4353,452,3062,435,4822,567,53564,1496,20703,4391,435,21320,435,3311,56437,56438,3048,85,2522,1143,1079,1588,6362,216,55738,6412,3256,1079,319,4822,2392,3786,1376,21320,3867,85,4456,435,3237,1588,1856,1079,319,1588,420,1258,1816,3237,434,5078,1588,2998,53564,1496,435,1079,1588,6362,3027,1111,2392,343,91,3261,6715,1143,1079,1588,6362,91,223,2967,1761,5552,1329,3640,1156,2515,1588,55738,91,413,47727,55738,2515,91,3189,2998,91,2967,1079,2211,4510,2992,435,21341,6127,259,343,91,452,2366,2974,3281,259,764,6127,4866,2392,343,91,1335,2176,3215,3158,21341,2814,63526,1335,3729,3496,4221,3419,12994,2392,343,91,1043,1921,3158,21341,2814,63526,1335,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2046,4562,633,4610,13052,1588,3421,1335,3304,393,4470,343,91,452,2392,343,91,445,2322,3224,2392,45,2046,4562,633,4610,13052,1588,3421,3737,5936,2184,70,2413,1661,34912,345,3421,6537,1882,1588,18409,6636,1563,3550,271,3470,1856,1079,319,6357,2025,5749,1588,2440,1079,319,4562,267,319,184,3224,14568,319,4822,4221,7835,20613,14503,6671,870,1674,319,633,17256,21320,1588,4071,795,2889,3421,1588,1240,1079,319,3261,3256,3108,437,443,650,2439,1588,24511,4345,1079,4062,11295,5438,1588,2515,3808,2392,343,91,3535,20613,14503,2392,2886,3128,1045,452,12168,2558,3814,3265,319,184,1588,705,24103,14503,1042,3195,3470,216,1588,1079,4805,4221,1859,6703,2392,2886,3814,1730,535,1588,4822,21320,1624,4822,2815,223,15272,56437,56438,435,2392,1816,5881,376,1588,4822,1985,223,2211,2392,2886,5749,2899,1330,259,1882,1588,20613,14503,3280,14503,287,1526,2850,6164,2479,3421,784,1079,319,2392,343,91,1335,2176,3215,3158,21341,2814,63526,1335,3729,620,2753,3930,4221,8807,2392,343,91,287,67,2322,3158,21341,2814,63526,1335,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 8807,2392,1588,223,2522,6362,1335,3304,393,4470,343,91,452,2392,343,91,445,2322,3224,2392,45,4357,2392,1588,223,2522,6362,2392,343,91,5248,287,2400,6697,3897,1623,1588,4543,3030,4160,6715,1588,6362,3839,1588,6362,2312,7594,8014,319,184,4227,6715,2959,3246,6362,349,3351,2725,6362,734,437,443,3351,2292,2725,734,3828,1329,3856,1111,1588,3122,4543,2392,6100,1734,1014,2589,287,2400,4392,1668,1933,319,867,4377,3737,464,4036,1752,7817,1668,1933,1696,64,93050,20473,4657,18030,2392,192,16563,1696,3806,1588,2992,435,4263,2273,414,4392,1696,3687,1588,1623,2273,319,867,1755,91,1696,7817,3261,3553,2389,634,349,3742,7833,625,14830,17099,1261,12696,3565,548,953,4569,1261,3458,8297,1882,1588,2392,852,1367,3276,12796,625,2701,2392,1588,223,7611,14478,852,3448,491,625,634,1516,21629,52944,2392,6999,2392,2927,17099,1261,2863,2392,2886,3152,3856,1329,223,2967,3686,3091,175,6396,940,2392,2886,2392,4353,452,1982,168610,5960,3115,1588,3297,4822,881,223,2392,958,2911,1588,3297,319,52964,2292,2960,343,91,452,168610,1214,4928,3317,1012,3194,3737,4375,11295,3783,1588,1484,7640,19226,45,3115,39,7134,2906,2392,1588,223,2392,343,91,1335,2176,3215,3158,21341,2814,63526,1335,3729,620,2753,3930,4221,8807,2392,343,91,287,67,2322,3158,21341,2814,63526,1335,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3388,2392,7594,403,1588,443,1335,3304,393,4470,343,91,452,2392,343,91,445,2322,3224,2392,45,6140,2392,7594,403,1588,443,1588,1079,4805,3261,2392,343,91,3882,403,889,1816,437,443,378,1882,1588,3608,3667,2312,10072,1588,2959,633,443,1588,1693,5547,3910,986,2968,1079,319,91,299,567,3737,1674,319,14143,2235,1588,3297,267,319,184,3224,7385,91,20703,21371,406,3224,390,91,20703,298,435,4335,1588,10364,1079,319,11295,5438,1588,10087,4445,2310,1588,25686,3456,3547,9386,2515,5381,1588,3808,3403,1563,3653,7594,2312,2192,1284,319,3339,764,4805,1079,1588,2028,295,343,91,452,3658,4589,870,2522,6690,91,1214,2012,4392,1696,1668,1933,1696,18030,18030,4349,1588,2392,192,11295,319,867,3029,1376,1730,287,1960,3497,319,184,3771,3825,902,319,184,299,2890,3109,1111,287,6715,2968,11295,319,867,2392,343,91,1335,2176,3215,3158,21341,2814,63526,1335,3729,620,2753,3930,4221,8807,2392,343,91,287,67,2322,3158,21341,2814,63526,1335,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1335,3304,2392,343,91,343,91,452,393,4470,2392,343,91,3962,1221,2322,3223,3224,2392,45,3158,21341,2814,63526,1335,1501,3207,2392,343,91,1335,3304,2922,7310,3304,397,3786,2982,2983,3581,2392,343,91,1882,1588,86837,1693,4031,1693,2321,3071,2970,2392,343,91,2392,958,3013,107,2982,2983,420,1588,1079,2934,397,3524,1079,1588,6690,4111,2392,192,3581,2392,1882,1588,420,2975,5590,3737,464,91,3494,5583,1079,1588,6690,2898,4527,397,2461,1258,6690,4638,3328,3470,3445,1588,929,2522,1143,1079,1588,6362,2310,107,1712,1143,3514,7347,6094,1588,643,2220,7607,3503,397,4536,1014,13072,4406,535,1882,1588,3600,2992,435,2392,192,1111,397,1856,6077,2580,5832,1423,604,1588,2549,1588,26200,33,3614,889,1668,1933,4314,1079,867,319,2413,1661,1588,1240,3614,562,986,12358,4588,2102,51562,1588,3806,2992,435,51562,12358,4588,11295,319,867,1588,858,10170,3737,192,6067,1620,113,7588,67,3024,1882,1588,3841,319,184,420,2867,902,319,184,3322,2968,6629,1159,103,3761,1882,1588,2392,192,12445,397,535,643,22565,397,870,6682,107,1588,7607,4249,1588,6073,986,1588,1588,4536,397,1111,2392,1588,6412,420,3194,91,3737,3146,1978,3043,4375,2392,1588,4543,1079,1588,6362,3284,1674,319,2392,343,91,319,184,52964,3091,574,14238,92194,319,52964,4822,21320,21341,6127,259,343,91,452,2366,2974,3281,259,764,6127,4866,2392,343,91,1335,2176,3215,3158,21341,2814,63526,1335,3729,3496,4118,9427,2392,343,91,1043,1921,3158,21341,2814,63526,1335,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1335,3304,2392,343,91,343,91,452,393,4470,2392,343,91,3962,1221,2322,3223,3224,2392,45,3158,21341,2814,63526,1335,1501,3207,2392,343,91,1335,3304,6140,7310,3304,2392,343,91,107,1882,1588,929,5494,91,4316,6362,4432,3839,3856,223,2392,343,91,3678,4160,6715,1079,1588,6362,6362,6362,1079,1588,6362,1730,2028,2331,4310,5494,2392,343,91,1588,3696,222,2029,5494,1143,1079,1588,6362,2898,2899,1329,3696,4081,2982,2983,2392,1882,1588,6693,3737,464,5232,1588,929,3532,2392,1588,3696,3970,343,91,452,464,2168,610,91,2896,2392,2886,2392,4353,452,1982,3696,2058,5960,2522,1079,1588,4805,602,14011,3452,46,1882,1588,2392,343,91,1079,1588,6362,3882,3424,6362,2392,1588,3696,3453,4543,1588,491,5232,1730,1079,1588,6690,2392,1588,3696,2906,207,223,6715,1143,6362,602,46,1588,44372,1079,319,287,1960,6697,8277,91,3737,464,6611,1588,4406,3284,1674,319,2392,343,91,1588,3297,319,184,52964,4822,2967,2968,3737,1111,3284,1674,319,1588,929,1601,5360,1588,3783,2992,435,20703,3582,535,4543,1588,491,1761,1630,3519,1079,1588,6690,3453,2725,6362,6715,1079,1588,6362,773,6362,1730,3862,2028,6362,349,2392,343,91,3862,3586,3856,4543,1588,491,2392,1588,3696,4316,1730,6362,91,1588,3696,222,3859,6362,3749,2968,1882,1588,2273,319,867,1455,6070,1693,929,3532,4052,91,3737,13818,4375,1588,4543,795,796,491,2975,3261,7820,4052,2392,343,91,2558,1693,2321,3071,86837,1693,4031,397,2982,2983,2634,1882,1588,3737,6080,2983,4638,1588,929,91,397,2392,1588,3696,3786,3807,6070,4543,1588,491,3261,3856,2392,343,91,2975,3261,2701,3737,91,3265,319,184,9777,1588,4543,1563,2392,1882,1588,6344,4543,4456,1588,21341,6127,259,343,91,452,2366,2974,3281,259,764,6127,4866,2392,343,91,1335,2176,3215,3158,21341,2814,63526,1335,3729,3496,4068,4297,2392,343,91,1043,1921,3158,21341,2814,63526,1335,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1335,3304,2392,343,91,343,91,452,393,4470,2392,343,91,3962,1221,2322,3223,3224,2392,45,3158,21341,2814,63526,1335,1501,3207,2392,343,91,1335,3304,2046,7310,3304,2392,343,91,567,1588,5039,4758,3860,21422,50805,21422,5080,10061,2392,343,91,3874,5080,3867,3860,21422,50805,21422,435,567,535,343,91,452,311,1588,5039,4758,319,184,2392,192,20703,435,50805,21422,3860,21422,5710,2161,17375,5829,84,12770,435,1832,85,567,1674,319,2235,2235,3123,319,14143,35980,343,91,452,311,1588,5039,319,184,4758,319,184,1008,3250,3874,435,6362,1588,1856,1079,319,349,435,1039,809,2392,5080,435,2881,190,3063,1588,3287,44372,1588,2392,192,475,827,889,1588,1014,3494,1620,10635,20079,1950,6127,3766,163,4247,3860,21422,2392,343,91,4813,10170,5080,3737,2990,1588,5039,319,184,4758,3642,216,1588,6412,3256,21077,319,2522,1079,1588,6690,3558,3879,2867,869,3467,14568,4714,10151,5080,343,91,452,311,1588,5039,319,4758,2968,5935,881,386,5080,355,2392,343,91,267,319,52964,2911,2392,192,20703,1588,5039,4758,2889,3757,319,184,5080,5152,4402,567,535,1588,5039,319,4758,567,1673,53564,1496,435,827,3421,85,267,319,52964,535,1588,4878,5375,4758,3331,3658,205,319,21341,6127,259,343,91,452,2366,2974,3281,259,764,6127,4866,2392,343,91,1335,2176,3215,3158,21341,2814,63526,1335,3729,3496,4118,12994,2392,343,91,1043,1921,3158,21341,2814,63526,1335,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2392,343,91,934,2392,3742,1597,3930,555,1597,3930,2392,3742,1729,452,1588,1037,3351,1588,1037,1882,1588,5933,168,4714,55738,15404,168,14011,1985,3003,1588,15404,168,7205,5829,3947,3757,668,435,4609,168,1588,6362,20703,298,3094,5080,2292,2028,2292,437,443,6362,2725,722,1588,3758,3471,3216,1588,6362,349,1588,378,8331,203,1832,1588,378,437,443,1856,319,1588,6362,1843,1588,378,2439,1832,4645,1331,2392,343,91,934,2176,3215,3158,21341,2814,63526,1588,3729,3496,4068,8807,2392,343,91,1043,1921,3158,21341,2814,63526,1588,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2392,343,91,934,1882,1588,1882,1588,975,21098,22937,1882,1588,3808,2392,343,91,2719,3030,1079,23892,3944,319,184,3471,1588,986,1588,4060,5130,5496,3835,205,1882,1588,5211,1079,319,3261,3256,14613,5905,695,2630,14016,633,2273,4345,764,4062,5438,1588,5438,3808,1588,378,437,443,6282,1079,319,4608,4247,2369,3712,6169,163,4872,319,4588,1674,3284,253,319,184,3570,2296,103,1588,1014,773,67,1588,967,2968,319,633,437,443,378,1882,1588,3608,2312,10072,1588,2316,6362,378,3944,319,184,633,91,2392,945,1284,319,4254,2235,2312,1284,319,10170,5036,12292,1588,443,633,4780,16714,5329,2568,9473,2470,633,4392,5564,1588,27929,1588,6087,205,319,633,1674,2312,10006,1588,3828,2630,14016,5422,1769,319,4254,4038,2235,5329,11321,11818,4392,2312,1674,4281,4392,987,4608,14143,3618,13815,40122,43074,2312,4304,7760,1476,13786,13685,3809,633,4470,4584,2522,4738,1588,8140,706,319,1730,4738,1826,11242,1144,2694,8878,319,353,633,1527,10269,898,11321,319,205,4392,4588,3281,1563,5039,4588,51562,20703,29,299,567,319,4254,4038,1674,267,184,1588,3224,14624,3224,434,319,184,3503,2312,319,1674,3091,574,4944,21089,8630,2312,6509,795,319,1945,118363,4019,4688,5324,3048,2312,20976,319,4254,2235,1674,1588,3224,3147,319,3326,5567,4485,1588,4113,14624,764,3083,1694,1588,3224,60712,4281,4683,3147,319,1674,3091,574,21254,21089,795,1674,14875,7809,1435,319,1674,15680,21371,21371,4944,10284,4608,3458,1563,5039,51562,4304,2603,4608,14624,4529,1281,2300,4392,319,319,4254,2235,2312,7648,7385,3091,574,406,1674,4038,7648,7385,12360,21371,406,1674,319,4254,2235,52964,3038,3657,52964,1131,898,4588,5329,319,4758,14143,3618,2312,2603,91,10170,5905,435,1588,752,2630,14016,938,633,1588,3828,319,205,14875,975,2830,30083,7385,2945,319,5159,3783,3685,5322,1240,1588,4113,5905,435,764,3083,5567,26815,1588,1526,4335,319,184,319,319,4254,4038,980,2312,91,10170,4335,2312,1284,319,10170,12292,5036,103,184,3224,14568,5943,2316,4335,3038,1131,3964,5080,3236,21320,343,91,452,3751,3628,14568,3123,535,1588,5039,319,184,4822,1588,4822,567,827,3421,85,1673,319,184,52964,535,7338,4758,2316,2889,4247,14568,1674,319,5080,435,1601,3537,1309,10366,1588,18409,3807,3832,2316,21320,319,184,870,1588,3775,1856,3284,23244,319,10045,4822,4063,8854,6094,759,2185,14613,7483,11124,285,3331,319,1832,1588,4822,2968,5935,345,5080,3236,1125,2968,376,2392,2886,1588,1526,3515,1588,7365,2185,5804,1588,1990,4909,4896,456,656,177,1588,1770,1385,6131,16218,1588,12031,24146,52680,1162,4759 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1335,3304,2392,343,91,343,91,452,393,4470,2392,343,91,3962,1221,2322,3223,3224,2392,45,3158,21341,2814,63526,1335,1501,3207,2392,343,91,1335,3304,4357,7310,3304,1752,1588,2400,1696,7817,2392,343,91,3897,1694,1588,4543,2392,343,91,3942,1752,1588,2400,285,2392,192,3737,355,4118,4357,1588,2400,1696,7817,20473,4657,18030,3094,3742,3043,3261,287,2400,6697,3897,3194,3737,91,3146,1149,935,3581,2392,1588,1588,929,223,3494,2522,6362,91,2890,5593,1111,91,3737,3828,4375,2392,1588,4543,4111,6338,2890,5000,1329,104,1588,929,5279,343,91,452,24103,5547,3737,91,7145,4638,2392,343,91,24103,5547,1693,2321,3071,397,5802,3737,91,464,420,967,929,2392,343,91,1882,1588,6703,26886,4249,535,643,22565,3568,2220,1588,1581,3737,343,91,452,1693,2321,3071,343,1693,397,355,15767,271,11198,1008,3668,91,1214,397,91,643,1008,643,2220,1588,4113,2992,435,660,1588,420,3503,4878,1837,1588,929,1214,1588,4113,2992,435,3553,2392,343,91,1214,2742,531,1766,2392,464,2392,2886,2012,2392,4031,464,1834,91,3737,5473,5960,2890,4392,1696,64,1668,1933,1696,18030,20473,4657,2853,1696,3806,1588,2992,435,2392,192,4263,2273,414,4392,1696,1588,1623,2273,319,867,1755,91,1696,4392,2890,3261,4357,93050,18030,3311,83729,7892,5593,7597,3194,3737,1588,420,91,2890,2392,4543,1588,491,3786,3494,2522,1143,1079,1588,6362,2392,343,91,3477,734,104,21341,6127,259,343,91,452,2366,2974,3281,259,764,6127,4866,2392,343,91,1335,2176,3215,3158,21341,2814,63526,1335,3729,3496,4068,8807,2392,343,91,1043,1921,3158,21341,2814,63526,1335,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 12994,1265,2392,343,91,3823,3737,271,1588,929,1601,1335,3304,393,4470,343,91,452,2392,343,91,445,2322,3224,2392,45,2046,1265,2392,343,91,3823,3737,271,1588,929,1601,1265,5942,3421,1897,4172,165,3823,1882,1588,4609,3737,2392,343,91,91,1214,5567,3040,1588,96,271,1159,1601,3445,533,4543,2392,1588,2522,1588,4254,6362,437,443,1693,1214,1730,5270,16218,5360,1588,2921,1322,784,870,5360,1601,535,75559,2351,10125,2569,1588,20703,287,435,6131,5360,16218,1588,4148,3030,1588,1985,2722,764,2992,435,1079,319,91,5547,1183,1588,2458,633,10072,1588,2458,6926,3123,2049,11847,2980,5547,3614,1588,15404,2312,2470,319,1588,929,223,3640,6159,6715,1588,6362,6715,1620,437,443,378,1588,271,5343,1588,3280,6398,2992,435,319,784,44372,1079,287,3535,2701,7077,3757,6976,3654,1588,1079,4805,91,3737,1111,4375,898,85,10284,4588,3284,1674,319,14143,2235,319,184,52964,2911,20703,298,3094,2235,1674,2312,1588,14875,773,1588,6663,3734,3029,91,3737,3779,1674,319,3284,4085,7170,1588,2392,343,91,3038,287,1111,1623,1588,4543,2392,343,91,1335,2176,3215,3158,21341,2814,63526,1335,3729,620,2753,3930,4221,8807,2392,343,91,287,67,2322,3158,21341,2814,63526,1335,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2392,343,91,934,1716,16,1716,1882,1588,555,1716,16,3618,834,3566,3840,2392,343,91,934,259,1882,1588,54453,23197,4218,3756,1882,1588,1882,3898,1755,1734,6298,1720,1882,1540,24341,26660,7205,2634,1882,1588,60951,1240,3602,2316,285,13061,13907,1082,11632,14911,5356,3229,7205,27148,1588,4705,1968,27245,3848,1330,17413,2470,5356,27112,4091,8219,1908,1734,319,13907,26900,12047,4543,15206,117413,10520,397,2392,3204,321,14911,3480,414,2392,1588,1588,7232,183,3274,32861,452,11632,26912,4543,427,27151,3063,1728,44750,6979,14703,1106,3043,414,2853,1588,4912,1153,168,8310,14911,6537,2392,1588,7487,6281,1856,319,1079,1588,18187,3757,6613,6070,271,13061,4406,4091,32861,1654,633,5905,4562,78329,8371,1227,1563,2316,397,3099,1588,5152,15982,1031,319,1588,1985,1588,7026,1227,7267,52021,1716,1882,1588,4171,1037,55738,7385,3003,2358,3503,3003,1588,104,6675,55738,4968,1601,3258,3524,78329,2580,3503,55738,1985,3003,7594,633,319,4494,4098,4968,1882,1588,2392,2968,1079,319,633,20703,5905,435,5080,1588,6891,1856,1079,319,3261,3256,3403,7447,1079,33,2273,4345,764,4062,5438,5438,1079,1526,4365,1588,3808,91,24103,1856,1079,319,4263,2273,13061,2634,46,6243,967,420,1588,7181,4638,1693,1921,1588,2392,1240,2273,414,2722,1079,319,11137,5279,1674,319,3284,12107,2392,3547,794,7170,1588,1588,967,1882,1588,3882,1959,1649,1423,2310,109,112,7385,285,14549,349,2934,2922,1882,1588,160,734,2633,1795,112,3204,634,829,5879,2358,22415,7896,3471,1309,88,7755,1992,3026,112,31059,5335,10013,319,21460,112,5159,6332,604,4609,7755,1992,3030,11476,5402,1882,1588,20079,3068,2310,55738,4063,3860,8854,55738,4909,3684,538,112,827,1812,1599,2949,9072,1354,1265,4063,2899,8854,1317,5343,1588,2391,2310,1673,849,434,2899,1673,3843,4063,8854,2392,1588,1641,687,8854,802,1795,319,867,21460,2392,1882,1588,9072,4053,1107,3229,13268,1391,168,18885,693,1812,1674,3666,1816,2853,1694,4172,1882,1588,3421,1897,6344,4609,693,26,12516,809,3800,4861,107,3204,1882,1588,438,1455,2136,2899,1795,1240,3654,3694,5215,26,1265,1816,163,3583,1588,6265,4375,4084,4172,7385,4084,1588,6352,307,2787,4218,34340,27222,4053,17495,521,4506,3125,4547,26740,2525,4084,80,4869,1882,1588,2316,2998,81070,1012,16634,29574,50517,1816,1795,1588,2998,26778,1816,26,3749,1588,1755,4084,5518,104,734,13817,1775,13061,2273,319,2470,1079,319,764,3083,1882,1588,929,1183,2898,2408,2899,1588,3371,3872,21304,5335,2392,192,3192,2627,1668,1933,764,26756,3737,4850,1859,361,2392,3834,1588,104,65894,4608,3889,4789,3471,1588,1269,295,2392 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 403,1588,378,437,443,2392,343,91,4297,403,1588,378,437,443,2392,343,91,4016,437,443,378,1882,1588,3608,3667,2392,343,91,3860,443,773,20473,4657,2190,1969,2392,192,1693,5547,3910,986,636,3737,3556,91,319,184,1161,5373,3265,319,184,3771,20473,4657,435,11740,1696,13912,18030,321,1354,2392,192,26756,1588,1079,319,3261,3256,24511,4345,764,4062,11295,5438,5381,1588,4445,3750,1354,2853,6136,3341,1588,22767,20473,4657,298,435,3118,1588,25686,2681,3403,1563,3653,7594,2312,2192,1284,319,3339,764,2392,343,91,7673,10061,10754,3638,3547,16387,3830,3449,7321,343,91,452,1079,1588,4805,2028,295,3261,827,889,4805,1079,1882,1588,4852,343,91,452,3658,4589,870,2522,6690,91,3486,1214,54,11783,2392,3261,7630,2960,764,905,91,6669,1588,929,2890,3640,4248,1079,1588,6690,3029,1376,596,1079,2911,319,867,4381,3247,3377,2392,192,2906,856,103,287,3475,163,1761,2997,4638,3786,163,3494,3519,2273,3106,5393,1588,1079,91,4381,3471,3654,535,298,20473,4657,435,5980,20473,4657,435,5078,319,184,596,1668,1933,183,11982,1696,168,1623,2392,343,91,1335,2176,3215,3158,21341,2814,63526,1335,3729,620,2753,4221,8807,2392,343,91,287,67,2322,3158,21341,2814,63526,1335,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1265,2392,3770,104,1588,1335,3304,393,4470,343,91,452,2392,343,91,445,2322,3224,2392,45,1265,2392,3770,104,1588,1816,3515,2392,343,91,1882,1588,15735,4609,2470,319,3666,1329,1588,1755,1079,319,633,2630,14016,20703,1588,784,1079,319,4543,11295,5438,5564,4098,1079,1526,104,3770,3614,1588,1240,13061,2634,1588,3274,55738,1240,13907,321,3898,3261,1240,2273,319,5829,1917,1206,1693,5547,2392,1588,1240,1079,319,3261,3256,1694,1588,4543,3737,1674,319,14143,2235,1588,3297,319,184,52964,52964,1755,2392,20703,2300,502,100,4335,2603,319,14143,2235,43074,40122,4588,2312,10170,10170,345,2392,5080,14568,535,4822,85,1673,319,184,52964,3083,827,3421,85,2392,192,343,91,452,3751,4402,535,4822,1673,2316,2889,4247,1674,319,5080,184,870,14645,319,4071,3442,1309,1588,2889,2392,5080,2392,4850,5438,3737,1960,6697,2522,1620,1079,319,2968,1588,437,443,6715,3770,5494,3261,3029,3737,2392,3779,1674,319,3284,4085,7170,1588,343,91,452,3038,287,1111,4375,1588,4543,1588,2392,2392,343,91,1335,2176,3215,3158,21341,2814,63526,1335,3729,620,2753,3930,4221,8807,3419,2392,343,91,287,67,2322,3158,21341,2814,63526,1335,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2392,1149,12107,91,3295,648,2853,4357,4016,3852,75659,295,15,1588,16203,45676,1588,929,3135,1867,175,3750,16716,20713,4454,4062,3860,21422,2392,1183,192,1095,2199,81,295,4483,91,81,856,361,3234,340,67,91,1567,1588,85,14613,192,1170,1014,3771,452,2392,1335,1716,3216,1816,2853,1795,1588,1694,3171,1281,3601,1038,3749,91,2558,1882,1588,3147,14706,3147,3015,13995,96,1746,271,3902,223,3570,1588,295,15,3449,1694,11234,4543,3261,2176,1483,2392,1588,929,3135,3773,8091,175,980,16203,45676,782,1366,65466,2392,1149,12107,91,648,2853,4357,4016,3852,75659,295,15,1588,3261,4482,1281,3471,2119,2392,192,20703,456,47727,1588,4705,13908,2184,70,86363,3764,7121,59665,1588,673,5234,7680,13661,20976,14624,24103,1601,8763,5381,420,22556,1588,8083,1588,2194,2351,4538,717,11868,1588,4909,14144,13908,70,3567,2578,26961,756,151732,4558,4036,2226,24124,378,1588,12903,13659,1588,929,3135,2824,1588,3568,1111,91,1588,391,3809,435,2890,2313,2889,1355,1588,2722,1079,634,3786,1588,13924,1588,929,4588,596,434,1111,3445,1588,3761,4160,1969,1143,87508,6362,2522,3860,4310,4428,1588,5877,11295,319,1079,2392,16287,4692,11773,20703,5905,435,298,3094,13061,10244,1588,12817,414,1079,319,1329,3565,12155,1623,10405,2273,414,319,10928,435,2273,319,867,11740,1079,442,4085,93,3303,2890,175,1354,1109,1391,1588,7653,643,2220,1173,7607,1693,24103,6311,633,5051,20473,4657,298,3094,11867,2351,24382,26961,11868,717,1588,1385,6201,4287,1588,24103,6481,1281,3261,25790,1826,319,633,10072,4019,4485,123110,1281,43690,2351,10125,5584,107202,1588,391,18286,26961,975,34988,123422,52758,2310,1673,50,12903,7591,1139,435,1281,12189,1588,2992,435,1985,595,643,2220,2600,1623,1129,1969,2392,192,13061,2273,319,2722,1079,3118,26490,2312,2408,16217,1588,5809,5804,4539,6412,24103,2176,7451,13715,1226,104,2911,93,1588,1014,442,1199,1588,1174,773,13977,3265,319,184,5532,25004,2176,18286,7385,2392,3539,25754,91,107202,1588,391,6131,4962,5901,4003,2176,1694,1588,11234,3027,2119,10090,13272,14624,3237,898,1588,3224,4281,5539,14620,609,15021,10090,4456,91,104,1281,295,2136,6480,4258,1431,1588,442,21790,2977,3194,1588,3256,1376,986,163,171,1588,1921,6498,5236,4980,1883,3768,3834,343,91,3768,2392,3471,1588,5360,1990,30694,4345,1079,535,6668,11344,4638,6974,7052,1802,1588,2603,2992,435,1623,91,11740,4091,20236,9460,7205,4406,5511,2921,2980,5360,6077,1588,5232,3676,24146,2569,2194,14911,717,106116,3147,535,107202,1588,391,2176,5438,2569,302,1588,3558,1588,3228,5360,1588,535,2351,11868,24382,26961,119466,11303,1475 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2392,1149,12107,91,3295,648,1265,332,2934,3852,75659,12107,2392,5461,2788,20438,1183,192,1095,2199,81,295,4483,91,81,856,361,3234,340,67,91,1567,1588,85,14613,192,1170,1014,3771,452,2392,1335,1716,3216,2392,192,856,355,413,1033,4134,2927,85,15174,1033,10081,176,3064,93250,226,15404,49836,14929,12020,7445,4450,6160,4644,5396,3118,285,175,20713,1558,50,4398,84,28789,2161,27190,28130,4091,2314,1114,5882,5829,10071,85,717,732,3636,7445,3670,104,2392,4456,827,705,3684,4257,3256,1985,93250,5461,3261,2176,975,3735,4532,2392,1149,12107,91,648,1265,332,2934,3852,75659,12107,2392,5461,3261,4482,20070,2392,192,2391,91,3597,4169,303,93250,531,4418,233,2392,225,5461,93250,5461,100,2630,529,772,3489,2392,2913,4217,8297,5878,3783,1329,3260,489,4172,768,93250,5461,456,10633,4084,734,3471,2630,1423,5952,6182,3970,12969,1268,3922,2168,3765,3765,2392,802,104,15443,22496,6416,5461,2109,5461,2630,2952,2630,22704,18422,827,13025,3946,4736,5109,1733,5094,2024,809,1329,56120,5110,4225,48195,3959,1843,22704,2630,1387,52417,192,1843,20713,5461,93250,5461,3860,1034,795,413,10276,12628,1034,10066,24669,186,2630,2316,5239,5461,3421,12151,403,2185,295,1029,34140,1037,34140,6354,809,2630,382,4840,43281,5461,343,91,452,1963,15983,36369,3927,858,2981,1752,1074,1799,12151,858,93250,2392,435,5461,2310,4527,93250,5461,2423,3531,3909,2966,1086,2630,2630,2325,6354,1074,4812,8882,795,660,4315,10072,413,759,285,20713,1558,5377,25777,3670,5272,8310,4062,2821,1330,15444,361,30511,2631,8641,4403,2392,192,3566,858,2966,2025,192,3737,355,2470,7807,4817,24103,3305,4789,2392,3927,21850,3323,2176,15179,1199,5461,3678,5888,752,5334,2968,192,24103,1956,25992,3737,355,2899,3885,2987,3927,1280,2392,22767,14095,1230,343,91,8525,997,2821,10890,975,5902,21422,4437,1125,114,1330,2821,47282,1372,5715,4062,3484,1329,4941,1199,1716,3216,5596,997,21365,2176,2465,84,479,4625,47347,29180,15162,17434,809,1038,3751,50,2029,722,4398,4418,5364,135046,93250,5461,11234,938,2630,1387,795,1314,3471,2293,5110,111963,975,3735,4532,4217,62619,3341,2630,693,4169,4816,49836,3586,42370,858,93250,5461,4482,1268,13924,1314,3204,12622,1014,3351,1424,3903,1019,5129,802,3800,7451,323,4928,285,4022,2488,659,802,86562,1268,5461,2952,93250,5461,4225,7048,660,1746,1317,938,5275,4594,320,795,1170,222,2392,4091,4134,93250,3245,2630,14659,1570,107,2927,85,2259,5461,2566,34140,36369,64780,3699,10051,2630,1423,17435,1985,2392,5461,3122,1268,16687,4172,2967,3331,93250,226,413,5878,3421,5461,2630,91,10143,2888 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2392,1149,12107,91,3295,648,1265,332,2934,3852,23675,56437,56438,2259,14834,108496,34999,1183,192,1095,2199,81,295,4483,91,81,856,361,91,1567,1588,85,14613,192,1170,1014,3771,452,2392,1335,1716,3216,21341,975,1029,6738,3331,3695,253,3823,7555,4849,24103,56437,56438,5818,1125,722,4351,3737,340,17706,4437,14821,21422,413,2392,2316,4456,1827,2317,47282,1391,435,535,5080,3737,722,56437,56438,2923,28130,529,4125,1354,4902,4456,56437,56438,4851,5544,3555,2259,14834,2392,3261,2176,93047,1570,2392,1149,12107,91,648,1265,332,2934,3852,23675,56437,56438,2259,14834,3261,4482,16,56437,56438,192,5461,9452,8297,3081,3082,192,330,3946,1933,259,4642,4374,13907,14745,1082,14887,192,17117,135067,4073,4080,3876,56437,56438,4152,14911,579,26756,192,5942,5231,3567,4902,3300,22357,5877,361,56437,56438,980,163475,1496,1790,413,56437,56438,4435,47282,1641,12107,56437,56438,3823,2177,56437,56438,5222,18096,22158,5334,15242,435,2050,3823,5905,763,410,2389,410,2392,7699,3086,6841,5933,867,672,1235,84,3771,758,3110,28760,5905,435,686,1142,2603,105149,344,5114,344,3503,56437,56438,758,3299,987,711,2960,764,67,6168,56437,56438,4851,3567,856,361,2176,1183,56437,56438,5080,1043,377,3158,21341,2814,63526,5080,5936,321,1563,442,214,233,82084,977,3236,3309,214,977,645,1859,23592,3503,56437,56438,758,2465,1790,56437,56438,192,1354,273,548,953,4850,8310,13741,711,867,3927,858,4402,56437,56438,192,5564,758,377,1354,3072,5588,4125,56437,56438,1867,192,3674,456,4125,3299,1391,693,3580,898,711,1037,2901,491,4235,758,3329,192,4788,2259,2316,10667,1029,34140,2192,4752,3841,4262,4422,4125,491,34140,15205,13178,56437,56438,192,758,1813,17483,3029,3758,4766,2232,1662,373,26398,6841,634,4136,1990,3503,3169,48595,4125,330,3718,48595,548,953,273,3072,3187,56437,56438,3169,491,4125,2893,2589,1673,56437,56438,785,6783,4456,12653,1045,16535,13794,4181,1908,28735,21304,1755,1265,1354,1816,410,11740,84,48595,4125,163475,1496,5726,9993,63227,4091,1183,1235,1507,609,3764,13945,4091,47282,42478,14120,226,1400,1943,214,3421,5936,1734,168,163475,1496,84,214,1882,1153,1978,13295,167,27028,13903,30959,2930,2400,2722,2211,21430,4576,1153,2310,85056,4547,378,43322,577,12445,1693,1882,1588,15469,82,1728,975,3226,2392,1371,1775,14834,975,9973,64396,84,3006,48595,4125,56437,56438,340,2119,3737,1072,2392,21320,5080,3793,435,3588,578,5870,3281,1968,14568,1265,2982,84,535,46680,435,2392,2994,5933,1775,14834,1170,2119,5588,4610,4788,84,4125,21304,7777,163475,1496,1033,32953,2119,1012,3861,84,3174,56437,56438,5818,2591,2025 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2392,1149,12107,91,3295,648,1816,2934,4357,3852,75659,5809,104,4104,33073,1183,192,1095,2199,81,295,4483,91,81,856,361,3234,340,67,91,1567,1588,85,14613,192,1170,1014,3771,452,901,2392,1335,1716,3216,2392,192,856,355,1117,16,1001,4511,138809,975,36379,1988,1524,121601,84,2887,15767,72978,2148,4149,1280,1354,2392,26756,1755,16831,64,4482,127,47270,412,5809,104,1280,2648,259,343,91,1280,5062,3786,2093,2647,4805,2162,8057,3816,3261,2176,4616,5080,2392,1149,12107,91,648,1816,2934,4357,3852,75659,5809,104,3261,4482,14606,3783,47270,2392,5518,1570,13942,1826,15767,2392,16,355,1986,2168,4589,3888,2392,16,3737,3628,4113,14531,539,15767,2392,16,355,15767,1135,7448,529,98,13856,5969,110199,52479,63617,4840,670,4610,14936,442,1354,3826,5930,2392,280,8223,1362,343,91,1280,1612,15767,2392,16,355,47270,3602,1816,926,91,1986,84,14639,839,1594,47270,4482,127,10534,1330,14189,127,3315,2893,60411,583,2881,5818,16,355,583,935,3923,4149,72978,3281,10267,3888,2392,16,1276,1277,634,3493,3581,2392,192,20626,4348,4756,27010,2753,2392,280,583,2880,5837,280,583,127,4306,6420,4482,127,4905,3742,7263,2206,6527,583,1125,2462,47270,1105,3742,4482,4625,47307,127,5260,271,4947,3846,27581,3443,15767,2392,16,355,1055,3443,4294,20897,27581,2168,1354,479,2392,4851,1116,1117,548,953,18988,456,27011,1420,7677,2392,413,1117,1001,1001,345,23223,980,5944,4482,670,2063,3955,3471,24970,926,343,3416,6749,4230,1001,2648,343,91,7652,7810,4658,452,340,21395,5484,5944,5369,4805,7089,2088,340,2458,7825,92191,406,2168,935,10537,4346,3229,5369,4762,25087,2200,3888,2392,16,3096,11234,13931,1622,3623,2392,435,52479,2396,4192,10069,3484,17636,1583,413,5316,51514,1990,92191,66176,711,1823,2915,920,3421,27011,3724,1476,1402,6330,1622,555,1351,3311,2392,1001,5942,3737,1349,1816,14610,92191,6127,6978,295,2392,15767,2206,4422,2898,15404,20696,670,5211,1029,34140,2890,2753,2392,5519,3675,343,91,3759,16731,33,479,5608,16527,148,437,1381,2392,1986,413,1280,406,4956,15767,4851,2753,1816,934,2392,16,355,3876,92191,4345,2648,1813,3484,4445,2392,343,91,5446,4482,127,343,91,452,5369,2890,4766,4294,2753,15767,2392,16,355,7532,24970,406,3292,15741,2392,343,91,5930,2392,280,22835,1767,3283,8641,3269,3698,935,3345,3816,3453,343,91,10061,259,16,355,3627,2392,357,1047,2890,4593,91,24103,4866,343,91,343,91,2890,457,4507,2753,1668,3126,940,2996,2012,16199,1116,2171,4616,64,3495,535,670,2063,64,1754,870,2603,17512,1986,6661,7368,445 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2392,3742,2454,3667,6495,91,2392,648,1149,163169,91,1816,2853,3852,23675,3295,4714,3232,1019,30025,975,101150,2043,1911,8423,2392,15404,4261,15277,2149,4523,13336,2934,5254,4247,9781,1019,30025,4752,4523,13519,15933,104,2556,1019,2631,14988,7779,5585,15404,2896,6246,14988,5735,3083,15690,5062,271,944,4261,3399,4523,13336,3735,13336,1183,192,81,295,4483,91,81,856,361,3581,91,1588,85,14613,192,1170,222,2392,2392,1335,1716,3216,901,3261,2176,64,9781,2200,1019,30025,15404,7781,4277,3556,98,11164,29161,3114,4849,2392,648,1149,163169,91,1816,2853,3852,23675,4714,3232,1019,30025,3261,4482,4235,15404,1019,30025,3884,2633,1329,1662,2200,5735,6021,20535,782,13570,442,13519,1761,1941,271,2952,3845,442,2029,2781,15404,11864,15404,15693,5936,15404,4261,1111,2025,9522,4523,14988,2192,4306,4540,6481,15404,4054,934,192,4717,457,16697,2392,17085,4456,4246,722,7538,535,456,434,722,14830,899,1335,1019,30025,3745,3897,29077,1867,192,1500,1183,25450,85,2206,1917,21680,2389,85,12063,2392,1111,5527,6254,2465,5335,2392,46669,5073,15776,85,14988,5735,6,15404,17396,4714,5254,4566,5809,20703,168672,5335,2200,934,456,1620,7608,3283,3281,377,3311,9206,22316,2470,1237,85,2029,3280,3281,6458,1329,3260,12622,1128,4442,2310,4714,1978,442,9206,14988,5735,6021,20535,110404,38053,14988,2273,4484,1790,4040,171,15887,10090,1001,1264,15404,2200,3433,1019,30025,15404,15767,295,4527,2392,15404,16,10616,2392,4714,2316,16863,17566,1029,34140,34140,5484,2648,2392,1761,16697,2603,788,7321,2023,5049,3453,1362,3571,4163,2392,4714,2893,4627,1029,168672,6239,15367,1031,5644,14331,531,4849,5084,2465,1264,15404,3531,3095,5513,479,944,168672,1162,2756,3751,99240,2722,3281,5435,2589,434,15175,15404,939,1329,168672,14988,5735,35715,4498,2279,4843,1423,2392,1978,5335,15404,4274,2185,4617,1019,2631,3759,13927,938,581,4247,5735,17716,2961,7297,1975,5435,5335,85,2156,1970,343,3307,64,3281,3945,2392,3281,2951,2465,15404,16,192,1755,3777,441,5779,1391,21304,47512,539,192,4613,870,15404,1209,6649,539,4714,3096,2392,15404,8646,2200,16053,849,3425,34140,168672,5735,4714,14838,103,4163,85,15767,975,3735,13336,1985,3841,192,1019,30025,25777,15404,3038,15404,4529,5335,7447,1019,30025,2781,2192,1329,3260,2331,5373,4345,1668,4714,763,2781,2391,1019,30025,4091,4598,1826,30712,1183,1019,2631,4091,4091,827,1019,2631,1826,5375,1329,1826,7585,2465,192,7585,15693,15283,23881,1019,30025,3043,4539,8423,6340,29161,21304,2022,4849,5506,4752,827,1941,3094,2029,285,1354,15367,1019,30025,4714,15404,3094,1039,3531,5268,2029,1019,2631,1978,30712,15404,5474,567 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2392,3742,2454,3667,6495,91,2392,648,1149,163169,91,1816,3852,8190,3295,7532,2392,5850,60406,21805,21806,2392,4353,6599,4507,2000,1183,192,81,295,4483,91,81,856,361,3581,91,1588,85,14613,192,1170,222,2392,2392,1335,901,57940,944,50553,168,192,3064,1330,4040,2952,4692,5984,84,2898,54868,2853,84,1330,5786,1170,7532,15741,2358,4819,1826,3041,1673,4071,4169,3860,21422,8845,1033,4225,2025,2987,10901,56314,5062,192,1867,2769,92189,13922,11101,2967,4247,33434,5929,2769,104,5370,453,15328,3895,4527,3261,2176,3860,21422,7448,529,15147,57296,26386,2392,648,1149,163169,91,3852,8190,1816,2853,7532,2392,3261,4482,15741,7532,3234,6124,5593,7170,5237,18096,6228,1230,2206,3667,387,285,61,2865,11135,505,1330,4040,7532,2358,2898,15367,3860,21422,7585,2392,91,7532,92189,15741,11135,29134,2240,15741,2440,3069,3096,1791,7585,2392,3742,6981,846,91,5779,1908,1720,764,92189,2881,3448,3053,6117,259,3071,29187,20840,3742,413,16739,92189,12468,16348,7532,15741,1329,3260,28666,15221,2258,3146,1761,25073,1354,285,92189,546,13626,30762,15041,16610,6358,16739,1761,25073,603,7648,1183,2258,26490,2149,4040,2192,2317,5698,722,539,7035,239,4149,29134,2240,92189,1111,3814,343,91,2240,1180,845,92189,2934,546,3109,15769,8598,9437,28666,2392,14838,1105,92189,22081,1623,7532,3484,15741,1956,15741,92189,1644,2254,378,5366,3281,16,229,343,91,104,7472,1329,4773,490,4303,1075,1943,2408,2044,703,651,2967,2956,5152,10275,3834,2206,2392,3711,479,192,1978,29134,168,25288,2392,1730,3484,92189,2881,11731,16585,1329,343,91,452,1295,33965,8641,12454,15741,2141,7166,560,343,91,452,92189,2893,33965,2672,3757,3814,3760,343,91,6481,33,216,2392,50833,832,1391,3862,764,4529,6649,425,426,2366,2273,229,3581,2408,4163,1716,15741,1130,2240,1527,295,54140,361,2392,22912,3760,3581,4543,3281,1956,11135,18348,16739,15741,413,2392,5593,8379,29134,2240,442,2240,7741,4040,330,2241,4663,35725,91,1354,17865,4394,16036,1671,2392,192,35725,251,2389,6166,1072,3421,2149,29134,2240,1199,5768,14977,1581,16699,2392,8096,2240,361,44126,4403,6248,91,3108,7585,5080,5864,239,15913,682,4217,15640,2115,2440,1968,2440,3069,2392,192,2240,2952,2392,192,3563,3421,262,1574,2558,2392,29134,2240,15035,2974,15741,3471,489,92189,3169,11135,2028,7473,44141,17833,11895,49232,3425,3670,25777,3090,168,20626,2119,3043,92189,4348,4902,3260,4318,845,15741,15741,9996,6560,5593,5701,8798,21304,1019,30025,1816,2392,3742,7532,47754,11135,1226,2392,192,7532,1958,68312,15741,361,29134,2240,1582,5461,390,2392,4657,3096,727,2119,411,3416,4740,15741,361,2392 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2392,3742,2454,3667,6495,91,2392,648,1149,377,91,1816,3852,47265,3295,16,2865,24103,9942,1988,1183,14662,2701,91,2701,2392,2886,1183,192,81,295,4483,91,81,856,361,2392,1335,3581,91,1716,3216,1588,85,222,2392,14613,192,1170,901,438,67,6278,14938,2392,397,514,4202,21577,5313,1330,2423,3283,2945,1183,607,1199,8280,2423,720,23886,3280,2392,23886,24970,478,259,500,1438,640,540,734,2888,7222,2063,3118,4421,24970,24103,3598,3581,2392,27010,438,280,4658,226,343,91,478,259,91,24103,2423,16738,2206,479,5,705,3261,2176,2392,648,1149,163169,91,3852,47265,1816,2853,16,2865,3261,4482,3025,4393,1159,1329,3260,720,23886,24970,12310,751,2392,343,91,1199,67,16,4258,24103,2600,1280,50078,1178,1329,1882,2063,7058,3145,2967,4257,14326,4909,722,330,1826,6976,5544,2392,16,16260,2423,722,2366,3872,2392,402,16,4645,3348,3192,2648,343,91,452,500,3338,751,1013,2392,27010,438,280,4658,226,343,91,2960,1708,1351,1264,3125,4616,393,4470,3471,393,540,31,3581,1013,1904,3462,5608,15727,4348,4756,27010,3421,1897,76412,343,91,1159,5160,12387,4956,3484,478,259,2063,2967,4943,6978,4338,34073,548,953,2392,104,6460,5081,5955,55403,931,17436,2316,171,2968,14308,4641,81753,1087,6669,5877,3537,1748,11466,8970,3834,1549,297,442,259,1181,56667,402,500,2911,67124,190,2769,1222,12131,2911,3835,960,6915,6972,2911,7561,705,2063,5279,53872,259,4493,1746,3479,1075,849,1162,7222,2063,3581,91,3775,4814,579,3737,2063,3043,1391,3071,6973,1503,1883,9453,4257,7222,2063,10332,3449,1956,15741,452,2392,27010,343,91,11135,3234,8391,7532,17039,2206,10890,20840,4247,2943,17039,478,259,2206,16,5080,91,343,91,3872,1877,11230,764,9,10,539,14379,2119,7561,3742,343,91,452,24103,478,259,4763,5917,2600,16260,17636,3014,3025,4393,2063,3030,3549,13102,5917,11087,3263,3685,2953,3555,4393,6976,5067,489,7538,1436,349,1068,1072,7760,3765,1329,670,30771,5519,20994,330,50,13983,2842,6538,3896,6201,3544,5917,2808,574,574,4943,340,2603,786,3063,1431,4804,4902,10024,4230,10051,6136,285,3283,548,953,2392,47681,670,2392,2945,1968,4019,2322,5942,2392,55824,5313,5100,2722,4310,56247,535,24585,2374,4151,17641,6481,705,2982,5791,5273,84,926,2960,1708,3094,187,3295,5917,4482,4610,104,2722,5100,764,4607,2392,727,2983,2872,500,5207,402,4549,2911,3835,16504,5484,12131,523,14936,7327,16731,259,452,15268,980,7585,29407,9655,2560,7170,7170,1058,5316,3003,2801,2982,2063,6201,6421,1438,23886,1280,1978,3888,2392,402,16,3882,1329,3299,1162,2119,9481 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3295,2392,4016,332,3852,75659,24948,5178,1581,16,73219,839,5187,8093,939,1329,2992,3096,73219,1754,2454,8820,397,2392,16,6331,17063,3281,14243,6504,18055,5187,15339,8647,5080,479,802,2983,442,16428,3590,2392,6545,70004,802,5652,141660,2389,7487,1583,73219,5187,8093,2392,5187,411,1183,1095,2199,2200,1095,2199,2369,13896,1181,1170,84,20703,5905,435,28760,298,84,4134,2392,2853,2392,1496,81,687,294,2392,2853,2392,192,3793,435,2392,4615,2392,4657,501,6225,407,13771,192,1095,2199,81,295,4483,91,81,856,361,91,1567,1588,802,85,14613,192,1170,1014,3771,452,2392,1335,802,1402,2392,192,856,355,84,1268,2161,28130,4091,14988,2757,3860,21422,2392,4657,2392,4615,20473,4657,92189,3737,355,30181,1524,67,92189,6399,839,528,2465,85,14742,5809,1019,30025,11013,1524,6279,16629,298,7857,21051,127,8162,85,27456,1612,4615,294,13903,531,13903,1800,6837,18640,116833,7892,6511,1524,62763,1524,5084,62,8967,741,2556,4134,13903,20473,4657,5461,2025,5084,21422,20703,453,2322,81,535,1170,84,81,2968,376,3737,355,12781,91,2121,13903,531,4004,1524,1524,1524,1002,4486,12963,3118,1033,84,5461,2025,84,5084,21422,25269,3860,21422,3749,5187,8093,73219,839,975,5652,141660,54868,2853,1149,12107,91,648,802,5461,3223,9114,1716,355,7716,15417,84,5461,2025,54868,1897,1496,84,54868,1897,1496,9391,54868,2853,20104,26964,84,1029,34140,84,780,8479,2392,1095,2199,1226,2200,3637,1095,2199,3563,297,3787,6854,2199,3556,2200,5699,2369,6426,33,1117,2392,4657,298,2392,4657,92189,133674,22323,3737,355,2392,1496,452,1969,3737,355,2392,4657,452,96,5084,127,2392,7857,298,8162,85,27456,1612,4615,2630,14023,27636,20473,4657,452,96,452,96,452,96,452,96,13903,20703,20473,4657,2630,14023,27636,1226,4016,332,2392,4615,85,2392,4615,3261,2176,393,4470,343,91,452,3223,3224,2392,45,5254,930,3039,2421,386,3300,393,4470,2392,1149,12107,91,648,802,4016,332,3852,75659,3855,802,3261,4482,442,16012,423,4435,5080,20436,24103,9126,3889,3736,24103,56030,4254,50680,4662,17705,17324,2756,7327,7193,960,8885,89334,423,73219,2050,24103,926,633,3834,349,2316,3458,5131,340,84,2926,1268,2316,3737,3835,10912,1037,5373,1142,11740,1766,5187,1642,13821,73219,1561,2488,3601,939,285,3118,6958,479,104,1037,4083,4319,73219,2254,104,8106,7699,802,21320,1265,410,9686,1143,23855,3036,48350,3565,27682,4686,3835,6994,14,7758,14705,1644,4688,59807,102727,6096,2188,3568,1900,802,3780,2565,2316,3898,4256,73219,2909,802,1613,27184,711,141661,7385,1968,711,2630,1563,3568,24207,21123,14875,1268,1111 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2392,3742,2454,3667,6495,91,2392,648,1149,163169,91,802,1265,3852,8190,3295,96,11711,11350,1183,192,81,295,91,81,856,361,2029,96,85,14613,192,1170,438,67,4483,9993,168,4134,2392,2853,2768,4091,1524,3737,6504,3038,253,2440,104,361,2392,4610,802,1265,7121,1816,2853,9655,7448,529,4692,5359,727,2556,17636,2087,1431,802,3782,1265,15007,361,2392,3147,15696,3782,3261,2176,21341,975,3396,19120,2392,648,1149,163169,91,3852,8190,802,1265,96,15696,3261,4482,4699,3090,5198,96,349,16138,2853,4062,802,802,4211,1265,16138,96,1049,2029,7810,10170,4016,15820,8626,711,14120,4849,2392,1496,13977,5051,2087,121196,607,4789,332,13977,5051,4134,2392,2853,13336,5335,2630,3096,28733,4172,5198,2502,1049,3756,96,6399,839,2252,14658,2119,1095,2199,92189,1170,5187,21369,84,1105,27389,3768,5809,5187,84,2097,1181,2119,64,127,413,16831,3429,2161,1867,6399,839,2097,1033,345,1761,3809,6399,839,93047,1570,192,104,5936,4849,3841,3860,21422,4789,4304,7760,2369,92189,6978,2252,14658,1265,61448,6255,6255,1281,1265,3809,5882,759,946,2369,127,2927,294,2392,2853,2119,61448,6255,47282,1402,2392,539,2317,4435,47282,2392,1496,92192,2853,54868,1897,1496,361,2392,1265,13927,2454,412,1761,192,1496,42420,2853,42366,1265,2853,2190,11164,1019,30025,14988,2757,1400,3258,92189,4756,5458,1400,5461,2025,20473,4657,5084,2853,539,12454,225,47282,86860,192,5335,1129,5084,2465,6613,124506,4091,1129,2392,4615,15252,1268,11677,5313,1268,11677,2927,4134,2392,2853,802,10495,4003,560,13680,2820,4232,47282,4712,3749,1039,13680,2820,5109,2630,1387,5335,10276,4437,2630,1387,8222,4712,938,1268,11677,24439,2630,1268,3882,6434,1673,9988,3295,1280,1986,802,1693,1402,727,2392,791,1770,14606,3783,4609,802,10374,1761,104,1826,5518,3281,2369,6317,1693,1354,21424,8091,2440,3841,2547,25422,579,4091,1068,55561,13052,2998,4697,1268,82,3881,1268,1183,14614,1507,14911,112802,2630,4315,30622,47282,91,3229,2270,4627,802,1354,1265,11483,3471,112802,2630,2927,2853,456,2630,3418,2992,4469,1094,4084,4315,711,50,26,13519,14144,13687,2630,3418,30971,3418,560,13570,2161,4315,30622,112802,2630,3882,10055,1673,2392,2161,294,2392,2853,14494,294,2392,2853,127,6976,10051,4756,27010,4348,1265,1761,104,2119,1978,168,1268,3063,4627,2046,17109,1170,15690,1867,93047,3281,489,2176,3756,2392,3742,4348,1131,4006,3809,35052,5051,1174,1431,4258,525,29332,574,574,192,14203,15252,2967,2853,555,2630,560,2820,13680,4849,4437,574,4134,2392,2853,13680,2820,2254,3749,2316,6498,802,8297,192,11677,2630,5351,2853,1029,34140,9973,64396,5881,706,2881,5227 1 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 4375,319,3783,1588,705,1588,934,91,2273,4406,1045,20101,3988,5870,1240,1908,1734,319,13907,5356,14911,27148,1079,319,6344,4543,1588,19347,3783,1079,15982,1563,1985,4878,6127,1079,319,2029,2273,420,1588,4060,1694,91,1588,4543,1674,319,3284,1882,1588,3808,27010,4658,226,343,91,2719,3030,1079,23892,3944,319,184,5130,5496,3835,205,1882,1588,5211,11818,1079,319,1588,319,3261,3256,14613,5905,695,2630,14016,633,378,3766,3485,437,443,8310,1079,319,4608,24511,4345,764,4062,11295,5438,5381,1588,3808,14503,1588,2842,435,1376,1588,2515,91,763,1588,4406,1588,2515,1588,2952,1826,271,5263,4218,1623,4249,4394,3768,10007,1588,3808,1674,1588,3828,2630,14016,13768,5422,1769,1674,319,5329,1674,14143,4304,3562,319,4608,2102,13815,40122,6,6411,4019,4290,524,4918,14143,10527,50,52947,1872,319,5356,26940,613,101,17861,43074,1674,319,3284,319,1674,267,184,3224,2911,91,2722,3823,4562,2630,14016,1978,3224,2185,1970,20703,85,2176,5396,3618,6094,3224,4610,1674,17039,2235,5159,52964,5181,85,5772,319,4758,6958,205,4392,524,48943,2312,91,10170,184,3224,2968,5159,319,4254,4038,2630,14016,2312,10006,319,5772,50,2577,4758,2312,17256,319,4254,4038,2630,14016,1674,14875,4482,6976,14190,3841,5905,435,1674,319,4254,4038,3284,2630,14016,2603,319,20976,10284,4608,3284,20703,20703,280,4348,1674,319,4254,4038,267,184,3224,280,4348,20703,1674,319,4254,4038,14875,2312,2603,85,20976,319,1674,1674,319,1281,1588,4113,14624,764,1694,898,85,5159,4588,1588,3297,51562,3653,1170,3284,1674,319,4254,4038,980,4335,2630,14016,4304,2603,14613,5809,2119,2423,1588,722,5396,867,319,2300,1674,319,4254,4038,5159,4608,1588,3297,51562,2119,678,48943,2312,91,10170,3515,1588,7365,2185,5804,1588,1990,4909,4896,3745,1770,1385,24146,52680,1162,4759,2626,1832,2391,3083,7447,2279,5867,1588,535,14087,55738,3003,1990,5438,5711,4586,3547,3640,16218,1588,3783,3768,3258,8616,1588,773,6362,14875,24103,3216,299,8843,1111,6715,4738,650,2439,437,443,1588,443,10063,3686,1161,3556,1588,3421,1897,259,1882,1588,54453,23197,330,14332,1882,1540,26660,49737,1663,2656,1588,54453,54454,214,3808,3311,27010,343,91,67,589,91,22474,2656,1588,319,14613,1985,1588,3215,3158,21341,2814,127207,1588,9070,3729,3930,3189,3158,21341,2814,127207,1588,9070,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 4375,319,3783,1588,21320,3581,319,1588,21320,856,6479,1674,319,2310,3470,1970,33,3645,5935,3559,343,91,452,252,1588,5039,7338,319,4822,2968,1744,2316,91,3737,355,4822,4083,870,319,184,21320,567,18232,839,1500,3393,4658,226,343,91,4221,1612,6140,2968,85,435,267,184,3224,1694,3736,4752,319,3224,1170,25136,3236,3123,21680,14645,319,1843,3224,759,4304,85,3921,3323,14150,319,1678,4468,870,535,3859,2968,3532,345,2722,412,104579,319,3806,1588,4304,2603,319,4758,2630,14016,1769,633,4335,535,4335,319,184,3224,2968,2211,24103,691,1588,7594,2312,205,634,319,4752,319,184,3224,21077,1674,13815,40122,26941,43074,4608,4247,319,1588,3806,11818,846,1174,2493,4896,3745,16218,1588,3783,319,6239,1694,1770,1385,535,763,3652,3642,8616,319,1588,3515,1588,3311,14372,1588,2998,1281,1281,104,3783,85,4392,319,5396,1674,3284,2603,5396,3063,21427,6979,1968,2603,435,2119,4608,1588,319,3779,898,14088,10635,773,3291,24103,3216,299,8843,1111,6715,4738,650,2439,437,443,1588,443,10063,3686,1161,3556,1588,3421,1897,259,1882,1588,54453,23197,330,14332,1882,1540,26660,49737,1663,2656,1588,54453,54454,214,3808,3311,27010,343,91,67,589,91,22474,2656,1588,1985,1588,3215,3158,21341,2814,127207,1588,9301,3729,3930,664,3158,21341,2814,127207,1588,9301,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2392,343,91,934,1716,16,3618,555,1716,16,3618,834,3566,3618,3076,1716,16,7321,3618,2392,648,251,2392,24103,361,3421,1716,3216,834,4044,2273,16,1335,3421,1897,16,2865,1746,3351,7222,2063,2392,1496,3118,96,1746,3308,2392,1496,7532,2392,1746,2934,2392,15741,29134,2240,1746,2046,7532,15741,2358,96,15696,1746,3189,2440,104,361,2392,17628,2392,17628,2392,1436,1588,1985,4575,2206,1588,10721,1993,8310,12945,24103,4104,2392,364,3344,861,2392,2392,343,91,934,2176,3215,3158,21341,2814,63526,1716,3618,459,3729,3496,4221,9294,2392,343,91,1043,1921,3158,21341,2814,63526,1716,3618,459,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 6140,271,397,8222,944,2392,1588,223,1335,3304,393,4470,343,91,452,2392,343,91,445,2322,3224,2392,45,6140,271,397,8222,944,2392,1588,223,397,2392,343,91,4702,372,96,107,1588,9850,3737,420,5484,91,1588,929,223,5547,397,113,4406,535,297,1014,906,319,2634,1588,2392,192,25018,107,287,1960,1674,319,1588,794,3737,5993,4375,2392,1588,4543,3118,397,491,2967,3686,280,2392,958,1588,4928,104,2992,435,2392,192,1588,5874,3876,192,711,7448,529,13061,2273,319,1588,2192,3261,3658,2992,435,2192,3653,1856,1079,319,1588,26200,3557,192,3569,3614,113,319,1588,1240,129868,26200,2050,2316,3247,2273,319,4428,11632,4314,91,1588,1229,1033,3772,1588,4403,3166,2392,192,1662,435,2119,6398,4568,2106,104,5547,3529,5360,3547,16218,1588,2392,192,2992,435,5360,3796,560,6668,784,3013,2310,3147,2029,1588,420,3910,2890,91,1214,91,2896,3737,6958,319,4588,867,2968,1588,91,4036,12902,287,2400,6697,3194,3737,319,184,2522,2968,1079,319,6697,2558,3737,1199,91,67,1588,1674,319,1588,3297,4758,5254,4915,1588,6362,437,443,6715,1588,6362,3030,437,443,6715,1588,6362,6715,437,443,6715,1588,6362,20703,298,3094,2192,349,5080,435,6362,3261,3458,773,4247,2522,1588,6362,5080,435,1588,4822,535,14568,3751,3628,535,1588,4822,5080,345,1673,1588,4822,567,10170,345,1673,4822,3581,650,437,319,1588,3261,287,3535,2701,3654,1588,1079,4805,91,3737,5881,3856,4375,898,85,10284,4588,3284,1674,319,14143,2235,319,184,52964,2911,20703,298,3094,2392,343,91,1335,2176,3215,3158,21341,2814,63526,1335,3729,620,2753,3930,4116,3388,2392,343,91,287,67,2322,3158,21341,2814,63526,1335,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3419,9427,2392,343,91,5483,3930,5483,3930,393,4470,343,91,452,2392,343,91,445,2322,3224,2392,45,332,3419,2392,165,14744,4804,6215,5875,3229,2087,2392,192,5886,827,827,10170,578,827,28130,4091,5886,827,827,10170,578,578,9995,1268,2392,1588,705,2681,4172,165,9838,1588,1588,7594,633,298,3094,20703,2470,319,2603,319,633,5483,3930,1588,1014,2392,445,21341,3233,3158,21341,2814,63526,1588,3729,1588,6663,3453,773,4588,986,3944,319,184,1588,14875,1588,4254,4310,2603,1367,1588,929,3135,3471,6663,3734,3471,2967,6387,91,340,4113,91,1012,5818,386,2392,343,91,2312,763,2633,285,453,4113,91,14,2312,3503,3695,2392,192,2331,3169,1019,5613,340,2705,494,91,1968,2633,285,3686,1309,4178,332,340,1968,3122,1968,4118,332,3169,175,5771,12274,3750,2046,3553,4178,3750,3616,1012,4058,4043,4221,15820,3471,91,403,340,165,37,2316,3930,67,3930,1012,340,165,1597,2392,3471,67,2948,340,1597,361,57674,3233,3158,2392,1474,3471,21146,3737,6512,2200,91,4536,57674,49794,1367,634,494,2871,643,4241,340,67,91,2300,92189,1105,2392,4615,20473,4657,1968,2633,285,47270,1105,1968,4144,7835,12274,7835,8162,85,28130,4091,4615,579,1949,4615,3048,96,2300,453,2967,10345,2392,4353,452,67,2968,3233,3158,92190,1474,91,20703,3110,85,2968,2392,85,3236,3874,20703,6509,1398,13922,91,20703,3868,20703,377,2968,1281,2392,192,4134,13903,20703,294,13903,20703,1968,453,567,2392,192,14742,5809,20703,1968,3096,2881,3663,531,13903,20703,1226,1968,2046,453,567,91,435,92191,4091,47270,20703,1968,377,2968,3096,2881,3663,2046,28130,4091,4963,10081,2392,2161,579,1949,33623,10081,510,10081,92192,2161,20703,3048,96,343,91,453,452,412,20703,453,734,7354,3351,453,2967,264,453,21341,2814,453,2967,2899,1795,3037,3219,780,453,1143,91,3603,1463,104,2633,285,453,1143,3844,8901,5843,3219,780,1143,3039,453,320,1226,3539,1501,1141,5429,3223,3224,11771,755,67,20703,81,2968,3233,453,21341,2814,1170,84,84,1039,5870,1268,4482,1170,5567,3686,802,1597,3123,81,26675,3118,1033,84,3048,96,802,322,54868,1897,1496,84,3049,2635,96,20111,2161,47270,84,3785,3048,2331,4098,2853,23007,5080,3236,567,10170,345,5080,2392,343,91,802,1795,5080,3236,1856,2392,192,3737,355,3236,2968,47270,67,1125,1978,1153,10081,67,1125,56437,56438,5818,1125,1012,960,826,3663,3236,2968,1012,3037,3263,5080,3236,3223,3224,2392,45,10345,4118,4221,5080,355,1226,1968,96,2046,5080,355,1012,297,60526,2392,192,3737,355,1968,2633,285,1978,1153,10081,67,1125 0 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2392,343,91,5483,3930,5483,3930,393,4470,343,91,452,2392,343,91,445,2322,3224,2392,45,2392,165,14533,14567,4804,6215,3229,13922,2392,192,827,10170,578,4819,28130,4091,827,4134,578,578,9995,1268,2392,1588,705,1588,7594,633,298,3094,20703,2470,319,2603,319,633,1795,2312,10072,1588,2292,1588,6362,3030,3419,437,5037,5483,1588,3930,445,3233,3158,21341,2814,63526,1588,3729,4588,986,3944,319,184,1588,14875,1588,4254,4310,773,1588,6663,3471,6663,3734,3471,2967,6387,91,340,3930,1012,340,165,1597,2392,3471,91,1968,1012,5818,386,2312,763,2633,285,453,4113,91,2312,3503,3695,91,67,2948,340,1597,361,57674,3233,3158,2392,1474,3471,21146,3737,6512,2200,91,4536,57674,49794,1367,634,494,2871,643,4241,340,67,3269,1019,5613,340,2705,494,91,1968,2633,285,1012,1309,3686,2331,340,175,65008,340,4973,3930,1385,1033,1268,10055,1673,5461,2025,340,1033,1268,10055,1673,30753,1662,340,3048,47270,340,5461,2025,340,10043,5461,2025,340,1968,96,91,2300,92189,1105,2392,4615,20473,4657,1968,2633,285,47270,1105,1968,4144,7835,12274,7835,8162,85,28130,4091,4615,579,1949,4615,3048,96,2300,453,2967,10345,67,2968,3233,3158,92190,1474,91,20703,85,3236,3874,20703,6509,1398,13922,91,20703,2392,192,4134,13903,294,13903,531,13903,20703,1968,453,567,2392,192,14742,5809,20703,1968,3096,2881,3663,91,435,92191,4091,47270,20703,1968,453,28130,4091,4963,10081,2392,2161,579,1949,33623,10081,510,10081,92192,2161,20703,3048,96,343,91,453,452,103,412,14624,453,734,7354,4357,3219,780,453,1143,91,3603,9067,2633,285,453,1143,3844,8901,5843,3219,780,1143,3039,453,320,1226,3539,1501,1141,5429,3223,3224,11771,755,453,67,20703,81,2968,264,453,21341,2814,453,2967,2899,1795,3037,1170,84,84,1039,5870,1268,4482,1170,5567,3686,802,1597,3123,81,26675,3118,1033,84,4428,3048,96,8847,802,322,54868,1897,1496,84,3049,2635,4134,2392,1496,84,3048,2959,1033,2331,29747,5080,3236,567,10170,345,5080,2392,343,91,3236,2968,5080,355,2392,192,47270,67,1125,1978,1153,10081,67,1125,56437,56438,5818,1125,3236,2968,1012,3037,3263,5080,3236,3223,3224,2392,45,10345,297,5080,355,1968,297,60526,2392,192,3737,355,1968,2633,285,1978,1153,10081,67,1125,1968,297,47270,67,1125,28130,4091,3737,355,3048,96,20626,4348,1371,1968,15767,16,355,1968,14871,1068,3236,1014,1019,5613,340,3169,16994,91,3905,1978,1153,10081,340,10043,5310,4389,20626,4348,340,14126,3014,340,4389,2635,4944,44249,1673,3503,21089,1673,3503,555,65008,1662,340,510,10081,9711 0 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1588,18755,147,1042,3233,1013,343,91,856,361,12107,834,1716,16,901,7423,4010,3914,3750,3351,413,147,1660,3808,2656,1588,54453,54454,54455,3341,6362,5461,343,91,79081,3014,6362,4842,2331,11818,475,18755,147,5018,1660,1588,5917,950,2287,3514,4703,3083,660,2968,3334,147,163,8277,5207,4598,1170,85,1588,705,30894,734,22704,1588,107,3897,252,8762,1588,3806,11818,18755,1932,773,3083,1799,4589,11818,5772,14143,319,14143,1079,487,535,42987,3118,27524,22704,1588,54453,59313,11303,3751,420,1837,5772,14143,30894,11818,535,42987,1932,773,780,1720,22704,1588,4048,5041,319,14143,1256,535,42987,3894,1079,487,13872,42987,3328,22704,1588,3806,11818,475,30894,487,2656,1588,80517,3569,3228,3765,2656,1588,1660,1079,1660,413,147,79081,5088,3303,4171,18755,1660,1837,2656,1588,30894,11818,5239,10160,1882,1588,950,2287,403,1837,3419,780,1720,1882,1588,54453,23197,535,42987,3419,147,1837,780,1720,1882,1588,3118,18755,147,4589,285,382,30894,11818,6539,3894,1882,1588,5832,1423,930,3582,3475,1882,1588,1660,531,259,6249,1882,1588,1660,3806,18755,147,1755,80517,950,2287,1013,343,91,1588,378,1079,2439,334,2960,764,361,1013,343,91,104576,734,2941,3737,4928,2960,535,5882,85,2992,435,20703,535,5882,85,21320,435,91,3245,334,2968,18755,147,10928,361,1170,85,104576,2941,104,734,764,12031,1588,104576,1317,1588,11204,1079,2439,102790,3303,4171,18755,1588,1660,2439,3295,5917,147,147,12031,1588,2316,5473,5230,2945,5804,1588,147,1170,5237,8772,18755,6362,5230,5804,5473,6362,5473,112,1668,18755,12149,2992,435,4692,3515,50073,2656,1588,5473,112,91,24103,2842,12031,1588,2194,633,340,5237,4254,18755,5473,2092,1668,18755,21371,21320,3644,3854,2725,3996,109,112,12031,1588,91,1694,403,3737,535,91,6116,2439,660,104576,3328,112,3898,1660,1588,109,102790,43990,8843,3303,2656,1882,1588,10130,3806,30894,11818,11818,8843,3280,2522,2560,1660,3014,8843,4402,535,4883,35032,14566,898,14758,535,552,42987,4017,8903,10051,42987,8903,5396,5396,1588,205,10051,42987,8903,2525,2994,1588,456,319,6891,3547,3806,1588,18755,147,3281,535,42987,8903,14758,1632,2940,88280,1674,6407,1588,1674,319,3757,23244,1827,1673,3063,1673,168,10006,42987,4459,2180,2865,2119,2252,717,6342,104,6976,4459,4693,4428,4392,717,1937,1674,4608,4201,4608,104579,3806,1588,14624,15829,101,4644,14143,535,14566,8133,14143,2235,34844,24829,26941,4126,1990,27929,1588,3556,319,184,299,3540,2722,3806,1588,85,11818,104579,2235,3806,1588,319,1768,319,184,14705,35980,4608,5324,4281,1588,3265,870,1674,1588,27929,2312,10006,633,20953,3715,4289,85 0 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1588,2273,16,1588,319,184,1693,1526,2392,1882,1588,929,2392,343,91,934,1391,2699,1588,46,6537,2273,420,13061,2634,568,3862,4263,3616,1079,319,91,1588,44372,11295,319,4607,24511,4345,1079,5438,378,3582,443,261,2312,4944,21371,2630,14016,85,3322,8310,1079,319,397,929,3705,3489,1588,46,2927,1431,785,4234,67,6669,397,223,2981,1653,67,319,2634,13072,2358,809,2392,1882,1588,1079,1882,1588,6690,3645,44895,784,5239,397,1258,575,1588,929,223,5832,1423,6869,22415,809,1882,1588,2454,67,4888,6428,3930,223,3897,4294,4593,602,2273,1882,1588,46,3030,223,91,3737,1588,2992,435,2699,2273,46,6344,4543,1882,1588,3872,3766,1329,17715,3043,2273,5412,3215,3158,21341,2814,63526,5080,3729,620,2753,9154,1757,3930,4144,8807,2392,343,91,610,7001,3158,21341,2814,63526,5080,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3351,2392,1588,223,2522,443,1335,3304,393,4470,343,91,452,2392,343,91,445,2322,3224,2392,45,3351,2392,1588,223,2522,443,2392,343,91,5248,287,2400,6697,3897,1623,1588,4543,3030,4160,6715,1588,4254,437,443,3839,437,443,1588,2312,7594,8014,6715,2959,437,443,4819,3351,2292,2725,734,437,443,1588,6715,889,1588,6362,4428,3589,889,1693,5547,3910,1531,3601,1588,1014,2392,192,1588,3458,7594,633,2725,3666,1329,2998,20703,3246,6362,349,4819,3351,2725,6362,734,2282,1329,3856,1111,1588,3122,4543,24103,5547,2392,4392,1668,1933,319,867,4118,3351,3737,464,4036,1752,7817,1668,1933,1696,64,93050,20473,4657,18030,2392,192,16563,1696,3806,1588,2992,435,4263,2273,414,4392,1696,1588,1623,2273,319,867,1755,91,1696,7817,3261,3152,3856,1329,223,2967,3686,3091,175,6396,940,2392,2886,3158,2392,2117,2992,1694,1588,4543,491,1734,1588,4254,7808,3447,436,7808,1877,1588,2400,491,91,3553,2392,2886,2392,4353,452,1982,168610,3158,92190,1474,5960,3115,1588,3297,4822,881,223,2392,958,3158,135057,2117,2911,1588,3297,319,52964,2292,2960,343,91,452,168610,1214,4928,3317,1012,3194,3737,4375,11295,319,3783,1588,1484,7640,19226,45,3115,39,7134,2906,2392,1588,223,2392,343,91,1335,2176,3215,3158,21341,2814,63526,1335,3729,620,2753,3930,4221,8807,3419,2392,343,91,287,67,2322,3158,21341,2814,63526,1335,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2228,350,25678,2228,350,25678,482,4507,373,7461,71,1549,9495,3071,9,10,1055,7168,20056,2321,1693,140,2553,3753,4304,7205,1588,1990,3753,27524,1693,1526,1990,2934,3036,2132,1775,4542,2701,3753,4304,7205,1588,1990,3753,27524,1693,1526,1990,330,350,25678,2881,482,4507,373,7461,71,1549,9495,3071,9,10,56458,2162,225,1563,751,1424,2960,1483,10936,259,2719,2901,56458,56458,4813,7792,375,7516,1484,24003,52840,45,2241,9695,699,3790,3753,1484,927,64004,45,257,2528,45,3790,3753,3753,2719,1045,452,9518,3926,1351,929,3913,3717,4871,7205,299,3589,10121,343,91,452,21341,1594,1693,452,21401,2911,5012,1843,729,4316,3614,1588,7205,567,1650,1588,4616,287,1526,3483,1693,397,3493,3453,7273,11324,1216,3956,5484,1079,7205,1588,9518,3913,2863,7034,1754,672,986,475,1079,7205,1588,1216,3503,1588,23592,10,3236,1014,5973,3753,39,7125,1216,1229,84755,11481,1465,986,764,7205,1588,3063,929,3532,23592,25747,5047,11856,870,1588,179,10,2137,23592,3678,1693,929,986,1344,8113,3326,1588,179,5993,1730,10,3717,23592,2137,23592,3532,25747,259,4630,4059,5868,6631,2534,60218,6072,3828,1693,929,7344,10087,163,1079,319,2968,1588,2316,764,3759,8262,17063,1588,319,1507,1563,530,319,1588,23592,1264,3766,319,17495,29,4024,10256,343,1045,3117,10,3503,1588,23592,287,4024,23592,17495,3068,3765,8854,1079,319,27321,27310,5295,1304,14375,1563,179,648,4083,23592,4941,3098,386,686,6204,1775,1507,1588,2488,96,5310,39234,5310,1304,5607,179,648,1043,377,5973,648,4459,4904,3806,3053,1033,535,5809,23592,4953,1330,670,15469,319,5809,1563,1045,1507,1746,14375,23592,4712,23592,2119,8262,5588,4968,4605,442,6169,1882,1588,2853,1588,7205,1012,6971,2888,123486,33,4066,1812,2011,795,734,25101,23592,12387,7205,293,2994,3773,867,319,10,23592,1264,3245,179,96,4225,23592,1265,12387,1588,12445,442,6169,1588,2949,9072,1265,7525,9485,4485,4627,2853,11632,6571,319,4304,14415,2992,4627,1265,1354,1816,4476,3753,5450,434,1660,10,148,1264,1693,3522,3234,3216,10,3261,215,52,1588,179,10,3614,1588,1993,179,3236,3614,13908,1407,96,3843,322,1558,3503,396,10,1264,4638,1752,2119,1264,645,386,1143,645,3324,3503,1588,23592,14,229,4024,3753,589,29,4024,2316,10,25116,23592,3488,1567,3493,4599,324,10,3503,1588,179,3503,23592,10,598,3503,23592,14,4024,1955,271,1306,338,8918,1983,3913,4024,9518,4024,3939,456,1327,2292,1351,435,1588,22474,10,2726,135233,3503,535,23592,2310,403,1588,3808,23592,229,610,1693,2794,650,5994,9725,27093,7483,4630,23592,1588,1993,1563 0 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2814,1882,1588,967,2392,1280,4609,18601,10591,8292,319,7205,2634,5994,1280,1588,14372,1985,1588,4609,18601,10591,8292,319,7205,2634,5994,2853,2149,5343,112,1588,7347,2392,192,1173,7607,7607,1143,672,2408,96,4113,14624,2470,319,603,3663,2890,4392,4805,2515,2310,3147,96,6537,1623,20703,2392,192,2515,802,96,3515,1079,1014,20703,6715,4113,9072,14372,2949,9072,4627,332,109,14372,2888,1588,6537,14372,2366,3261,2470,319,24103,3737,3642,16218,14372,20703,18000,3663,18036,4610,600,2749,319,2944,4345,764,4345,764,3605,5438,357,1265,15107,3737,3783,319,3147,2739,3338,764,1827,4589,3147,2927,5438,420,3566,23341,3030,4098,1079,1526,7347,3808,2934,294,13903,20703,14372,3230,1156,3509,839,3397,33,2366,3304,295,2392,5221,3189,1588,5585,295,2392,3230,9072,643,2220,535,4536,1014,3567,2967,3640,1623,2392,4543,1588,46,2220,3812,856,643,3204,4928,104,45276,4091,361,1129,1969,2392,192,3311,92192,2161,20703,2192,1826,1079,319,3204,634,535,764,1280,1588,4428,3856,5279,216,4543,1588,4358,3003,4575,1111,1694,2392,1588,4543,1674,319,3284,10284,4588,1588,3297,158071,51562,1790,5268,1588,934,3496,664,1043,1921,3158,2814,2392,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1013,355,2794,1752,773,59089,355,2794,1752,773,1013,1878,54570,975,9607,32820,1013,355,2794,343,91,452,1013,343,91,1966,139327,6573,3328,1271,1013,355,2794,1013,355,2794,1752,773,343,91,452,15691,2252,1265,1966,139327,6573,114,3906,3440,1002,3043,2023,6167,3043,114,4424,2023,223,21346,17300,64,340,127,64,1986,3495,16,1371,343,64,4616,1990,21385,2970,3295,397,514,1887,3295,3043,5581,2273,2023,223,50,1351,711,4099,2794,1588,993,27485,3927,3462,2794,4314,1693,929,4536,1949,3043,1002,1013,355,2794,93054,2701,3908,3606,355,2023,67,397,2701,958,4342,3538,4342,16665,3538,114,3914,773,4930,5581,3440,16431,4902,8641,10908,1013,355,2794,763,4281,3445,3486,1362,3261,3928,2967,2321,4424,2273,2794,1431,490,929,17447,91,1214,672,35542,2082,1964,720,25347,1969,1013,1653,759,104,91,29424,2924,3764,223,14671,21332,64,377,475,397,3555,10632,10051,47530,1366,529,271,1214,470,5969,5617,4593,64,3495,2872,4424,2794,3135,4905,6917,1581,5993,259,640,7222,332,5934,273,98,1243,1013,2943,3823,673,16658,91,27485,4965,3334,4527,795,2890,2270,7273,929,856,2974,3034,2701,3443,1064,4259,16,3520,4234,320,929,10160,929,3816,3717,1013,1329,3666,5097,3582,1258,320,763,2050,2001,4374,4851,2656,1588,18601,4645,827,6947,578,978,1949,3261,5777,91,21415,21416,4392,1970,2001,4374,2331,4451,3856,5777,2890,403,52425,1755,91,1335,763,25179,14990,46,3261,5323,6391,229,4851,2088,233,46,29923,510,3605,4374,1933,1594,4596,1970,4365,4374,4310,3204,5226,46,1730,91,16731,17753,6332,3927,1214,6130,7516,3261,3535,3765,397,71,1216,106,14,4031,3115,249,1799,490,4176,2944,1013,5070,7910,4752,4310,7202,4721,5932,14406,4365,1933,20072,2270,1111,91,464,610,229,91,773,4729,5962,1552,91,2794,223,4257,7528,4054,4902,4065,175,4586,2945,16431,4902,759,4902,91,929,2119,7561,456,3546,3445,6608,67,4424,2273,2794,4111,751,67,1409,1388,1581,5327,2211,3658,91,1043,377,3158,21341,2814,24146,1029,80409,2141,1013,355,2794,1002,2633,3988,9988,21328,127,955,21328,186,127,955,2959,2996,21328,3315,3555,2393,2479,140,4665,106,1983,7036,20843,119293,8589,3658,975,3226,984,26986,3043,2023,6167,15415,21328,139328,1013,839,17430,1013,2953,3555,5012,271,539,29856,8297,1013,839,2393,3927,858,106,1983,7036,2479,140,3261,795,796,107,5328,1013,839,271,3322,7483,3013,827,3692,23331,17753,3855,2357,1899,858,3807,6669,81,1145,2548,1013,839,3555,7034,6498,8297,3772,381,5364,5335,73,3988,3765,1637,21328,21328,349,16943,4798,3988,9988 0 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1693,6038,67,1799,1882,1588,54453,23197,5969,67,1882,1588,16101,1563,118944,5164,13061,20236,17999,6127,2316,2502,15277,1882,1588,3537,6987,2050,19347,26858,6038,14875,1882,1588,3834,2331,3043,28736,26888,4851,3014,11773,209,4627,1143,1588,1730,229,3234,3780,1985,1037,1882,1588,1859,2945,2886,172,1882,1588,54843,1563,3861,4399,1114,814,531,259,1588,6038,109,44498,10422,4063,8854,112,23341,4063,8854,47727,1588,4063,8854,5343,2899,3544,1673,795,1882,76534,6749,3868,21968,1882,35157,1882,50277,9022,456,579,4698,1925,1882,1588,1540,26660,1882,1588,2899,15212,28691,1673,1588,3568,6420,1079,3568,1673,3861,4649,1588,2122,3861,2310,2899,9995,795,5832,3589,4322,109,4218,1391,4406,414,1882,1588,4406,26888,4218,26905,26987,168,4315,5065,2465,23165,4083,435,4399,27027,4314,11740,319,2794,9158,1045,6032,3091,21052,4627,1816,2853,4107,3274,3234,1265,2949,321,2968,319,1588,60954,1240,13907,26901,183,1445,11632,3229,13052,456,2082,5877,82,1369,1588,3256,5356,3274,2363,4668,32508,27148,24989,993,994,4608,442,16,19298,349,1816,1795,4218,4627,2934,1354,2922,104,109,479,3582,2470,112,1423,23341,1882,1588,1859,20236,4406,6038,393,3701,751,1693,610,2270,55738,4254,2968,319,5218,2316,3684,14103,1423,2310,3118,3261,2149,413,1329,1588,560,795,4548,971,109,3868,14549,19298,96,4032,349,5095,109,109,112,8768,112,216,19298,1014,23820,112,2149,7741,9072,3189,664,7763,123104,4482,3416,2458,20079,2185,1720,3118,55738,4063,3544,2420,2358,2316,435,20079,413,2310,3834,2254,2358,23341,4218,3261,802,5829,55738,13272,2328,112,4649,2149,55738,11479,2633,1795,1330,3122,112,372,1816,7170,2149,1588,4529,109,479,1761,1385,2470,5263,2149,1588,3788,4083,4406,47727,112,3458,3579,3311,3003,934,1720,1409,435,5877,535,104,109,112,1720,7909,7909,5832,3834,934,5263,1588,1956,168,3471,1588,168,479,2200,28691,25830,302,1882,1588,763,168,4714,3751,20695,4120,1033,1012,1882,1588,7322,6297,4609,693,26,294,1072,809,4692,802,52341,9072,1588,1240,987,11092,55705,4218,13977,7082,802,25101,52341,9510,1588,7058,26367,165,1597,5373,319,802,802,9072,25569,3848,1107,2088,23165,14876,168,5019,4712,2316,9072,37,4547,13907,21365,25655,27310,2578,2942,2316,112,109,2945,9072,5818,4547,13907,163,9072,4172,1111,5380,2781,1588,9072,3644,6682,6498,1037,1882,1588,15982,1563,18315,10487,205,1488,4048,30700,25125,319,3108,1588,14624,3311,934,11818,23892,1674,319,4608,17063,1588,795,1385,23211,2665,4897,3030,319,4065,1588,479,1033,2470,319,1882,1588,3588,19347,41803,4218,17630,1079,2656,1588,1882,1588,5438,1079,3653,1826 0 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3540,2522,26305,1882,1588,4805,1018,3441,5962,1079,1588,4805,1730,1018,1588,17845,568,578,827,6947,8390,50515,3400,1018,2941,3801,3565,3261,2316,2681,46,3018,3515,1588,6157,5182,435,3497,1588,4406,1045,435,3823,764,2945,5880,1588,764,4737,1588,6400,2672,6629,9859,11145,7205,1693,5373,216,434,3628,1588,2992,26591,420,26305,1588,986,2522,3083,889,437,443,74,19338,5487,5232,986,5564,3015,1079,2439,1730,5236,207,2665,3565,5473,3640,3642,2522,4805,6076,1141,1588,3862,420,764,26305,1882,1588,929,152,2753,2992,1970,3540,6211,2522,1079,1588,4805,152,5088,3547,3234,104,2522,1588,3862,3623,3153,4851,2753,372,1588,179,96,349,10454,7246,2731,371,4118,4178,612,82,96,3377,299,3654,7205,1588,6157,1730,1391,6381,287,1960,5896,2890,3814,139,2400,1882,1588,986,2992,44087,784,31676,1161,2992,6157,1008,8770,26305,1588,2449,1018,219,2691,26305,1882,1588,929,152,1956,1693,5547,2830,23692,3153,4851,67,1960,2602,8502,33963,5515,4851,221,902,2602,17223,129638,3734,729,1757,78947,10454,371,1693,2321,851,33131,1524,97779,29100,371,1693,2321,851,1956,87521,7246,371,1693,2321,851,4357,3840,4819,1018,1588,46,1720,3766,1563,585,634,202,4432,7140,179,299,6355,3861,96,4630,3862,1730,23207,349,435,15363,44586,2287,1588,179,8096,3048,929,1376,5160,46,5236,104,3288,3589,322,349,179,4203,4819,3308,3674,1391,1143,1588,3808,4432,96,349,1588,4225,9072,14484,660,3586,46,13095,37750,1752,46,3018,14484,3261,1730,6505,202,1018,1588,46,6538,3018,14499,3018,4772,6854,6505,2168,3686,3400,46,1329,1752,23031,4627,3018,8116,9498,5494,43606,1018,3674,2049,10,3018,1588,3862,6157,3663,5373,1391,1256,7607,1588,46,3018,2941,2279,1956,21599,46,3018,1882,1588,1018,2941,10012,649,3586,4772,6854,3018,3946,14499,7607,581,1143,1623,2853,14484,568,1588,1018,3497,2941,1588,14484,1317,371,1752,1317,371,773,1588,14484,3801,6355,349,98,1129,7347,6947,1588,403,20528,6832,11771,24375,1568,2240,371,6106,4851,2929,371,5014,26246,425,22550,14875,26305,1014,3556,3589,906,3083,1588,371,3947,1720,3110,5952,2310,18333,229,3856,1588,1018,2898,413,4527,2331,2665,1045,4406,8390,9158,2898,1329,2025,1391,8940,3234,1588,319,14911,25041,1882,427,2270,1752,2959,2960,30754,209,229,6715,2960,30754,209,18446,15374,435,9158,372,202,1045,11773,12463,27172,3261,2959,2960,30754,209,3122,372,435,578,1588,2567,12817,1588,56287,827,2567,435,3304,6355,349,5515,6106,4181,1354,5473,2065,112,2952,802,5254,6947,52,179,96,2635,3556,413,96,3083,96,179,3861,734,3048,11339,371 0 9639
+1588,416,2392,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 308,393,1594,1693,5842,3222,3223,3224,20195,1574,1524,1524,1693,1524,54453,23197,1524,1882,1588,54453,23197,5862,259,1882,1588,1588,329,330,4432,3834,330,5132,1882,4904,14308,24341,1540,1882,9022,50277,579,4789,14016,2316,308,1882,1588,1882,966,1588,3558,4851,2902,1540,35157,14308,1882,1588,3565,26660,14308,3030,764,8140,2656,1588,1882,1588,693,3565,4644,2701,3861,5496,1114,3597,2025,1882,1588,6185,295,5865,849,16087,2656,1588,1882,1588,3637,2185,604,109,3588,1391,112,5343,109,1317,8854,5343,112,1317,8854,3558,96,319,5218,6116,5343,4063,8854,1882,1588,434,1673,827,1673,1673,9988,5056,14578,672,2580,1882,1037,1588,1882,1588,2316,3834,3588,814,531,259,1588,1588,2888,103,3872,308,1882,1588,1993,16366,13185,26305,1563,3581,219,2082,1588,3862,1730,3092,14484,223,103,6157,1882,1588,46,3018,3295,1563,1882,1588,1859,1329,4543,1882,1588,7766,4120,7811,6284,4120,1269,4878,6613,3861,10537,28691,1111,15404,168,1882,1588,3751,20695,4098,1882,1588,156,13184,22488,2273,15377,1588,233,4419,65825,672,1882,1588,3568,634,1882,1588,3568,10495,5351,3861,9995,1908,10533,5351,795,4699,434,9995,6420,1079,28691,1956,1945,1588,535,84,4610,479,84,47382,2400,3568,26956,1588,634,28691,1956,168,27245,3848,14667,2458,168,302,26937,163,4610,3614,5100,1588,1882,1588,6746,26956,1284,321,4547,11632,1082,1563,2458,1882,1588,16498,3588,475,1588,112,55738,19298,1588,4152,3281,11740,319,1588,15982,7440,6298,560,6340,6254,763,3588,3622,2505,10487,205,1488,6682,319,4499,4127,5343,1882,1588,163,1734,1588,46,2567,5237,1039,2929,308,11740,319,4038,2982,4482,16535,2479,3623,229,5263,1588,934,1720,1826,319,711,4482,3136,4589,435,934,1720,1268,16300,321,9996,11632,14415,14549,96,3684,1882,1588,1720,435,1229,1033,438,5343,109,5081,225,435,13061,319,1588,2998,104,1281,2316,5051,3750,56314,7205,1183,319,5829,307,3848,11485,168,12653,5019,73,980,29675,168,1882,1588,60954,1240,321,1563,966,1588,414,3068,321,3487,3068,1563,5356,1588,1240,4761,85041,17932,321,11632,1445,5356,27148,4393,1563,14375,13907,1588,3808,1240,82,13275,1692,14493,4627,1816,1882,1588,2998,7205,1012,1730,693,604,966,591,802,3588,9072,168,2136,734,1588,1072,809,10508,4692,693,26,14144,1588,3588,1240,987,3654,3694,104,602,394,889,711,4468,535,1674,1812,1588,2952,294,435,1265,2119,3109,1588,14654,1008,2998,3770,734,1588,3261,3622,1674,1812,18601,308,1882,1588,3588,1959,9158,5343,1329,1423,2888,14732,1329,1330,1588,14549,1354,1816,2951,7755,1992,1309,4016,112,4113,9072,2674,784,3759,46508,7755 0 9639
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 904,2839,2389,3888,39782,5639,1048,975,1048,975,9370,371,2753,664,371,1527,141,1029,435,1229,1033,14,46,14659,1043,377,3158,3371,9370,1146,1048,975,10267,1249,3147,9370,640,3776,5917,540,2781,3471,21828,4040,540,4032,234,26999,3344,9370,9370,640,1859,4892,3623,904,4902,3032,4596,3491,2648,271,371,12454,6125,4784,3491,280,1349,664,330,6276,371,9370,640,4736,371,1527,2348,2853,371,71,3453,141,1029,121659,330,371,1527,413,1329,2987,1623,141,1029,4428,3742,271,371,9452,39582,371,3315,371,7108,2888,9370,371,28099,371,3623,9437,22328,371,413,1329,2648,9370,371,3043,1882,22328,529,3280,560,9437,371,9370,371,1031,1761,1630,1351,28099,371,2753,9370,28099,640,453,4482,2316,371,3295,10,1933,259,46,7170,9370,371,287,1351,3480,2603,14,825,2912,9370,371,326,1558,8402,271,371,1280,1155,1986,579,14189,12068,2130,2967,1155,4849,656,4688,1330,8402,1803,3083,8402,413,1280,1986,6352,1155,1933,656,34340,17867,168,11740,14319,5867,3495,5373,80,6091,711,21655,1490,16966,2627,435,4905,3147,222,781,50680,402,858,2188,2558,1129,271,409,5263,295,21105,330,1720,233,3421,19550,2888,3742,579,233,1354,2627,3122,3742,1574,3266,2749,4160,2898,26855,330,26855,9420,1766,903,6527,1300,5271,3011,548,1980,330,2092,3780,330,2987,60784,141,1029,3526,141,1029,5353,11865,3311,141,1029,3768,2029,330,8524,1354,1668,5353,3780,3745,330,141,1029,3122,121659,330,7640,1265,2018,1419,764,4791,3812,1420,1690,17365,764,330,1420,4387,1131,5373,151496,121659,4391,192,804,25116,1607,10003,904,402,445,3453,10003,111,28099,640,30940,2317,2485,445,24447,4593,343,64,377,24447,934,873,1960,355,53909,5221,4336,4435,226,6567,87249,343,1189,21332,18034,1755,30745,1045,343,91,2821,4236,1420,4019,2465,28099,5320,1652,390,9370,371,9370,640,453,390,579,233,2627,1607,9370,3295,5933,977,839,5710,91,5187,3403,3742,148814,9370,26848,5081,920,9420,1968,453,8630,3448,3737,506,192,9998,233,1045,1574,3266,435,2749,4160,2898,4788,8647,1145,9370,371,226,6567,87249,15727,4437,5814,4187,18541,21328,3118,1570,2391,3118,10,104,16254,2049,28099,453,1596,555,371,16946,2317,579,233,9370,640,453,3777,2316,3889,1816,47445,3337,5515,5479,233,15015,7482,4084,1631,3416,4129,4315,839,4456,9988,13903,26923,9994,1045,2753,8630,5906,6127,1183,2898,1249,1371,15727,17276,91,192,141,1029,435,9370,371,71,8402,1129,2013,3223,3224,141,1029,1146,6691,1222,2602,1196,782,6889,2043,3223,3224,53909,1146,1196,3735,579,2043,3223,3224,24447,1146,1196,999,1540,3223 1 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2744,1043,377,2744,1043,377,187,117961,491,1043,377,2952,1048,271,187,117961,491,1043,377,3014,1043,2176,2968,377,1330,187,117961,491,1043,377,491,490,1043,2176,3930,24824,8807,21379,2744,1938,2814,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2740,2470,377,459,1111,2211,3734,2322,4878,2566,3516,1388,2936,729,1203,3734,3304,16,2322,1892,2675,120,1775,7402,1775,1005,3307,1005,3488,554,1968,2935,3584,3348,1779,287,229,5772,1982,620,3859,1513,287,67,1516,191,623,67,6972,1729,554,386,1254,620,24329,2231,409,1549,28228,3844,8859,26502,3348,10971,1005,2348,4590,67,2348,4590,67,4590,67,3013,2348,6191,402,1384,4590,1111,259,4140,1990,55089,491,4140,323,5196,1834,2348,3232,459,560,2348,221,5206,26317,12465,16,2740,1524,4226,6368,1524,6748,371,2740,407,3050,11169,24394,6029,25220,371,2740,3223,3224,24482,36137,151535,65645,371,2740,1859,1153,3050,23274,11534,11715,1524,15247,371,2740,3223,3224,11534,273,5717,26611,3773,371,2740,3223,3224,34774,24433,6948,14988,371,2740,1230,3695,63610,9799,6022,19043,371,2740,2190,2913,24730,1524,5194,7463,11689,371,2740,98,141,2933,57596,16442,5308,9335,371,2740,3223,3224,16442,23984,6035,5623,371,2740,3223,3224,23984,15541,4164,27266,371,2740,1524,36015,9986,7468,770,1524,5715,371,2740,3223,3224,24569,24614,30562,24137,371,2740,3223,3224,1988,273,33659,316,9847,371,2740,3223,3224,6019,28191,1809,25116,23969,371,2740,3223,3224,3978,24009,151536,20536,371,2740,3223,3224,271,1562,24010,6368,2205,371,2740,1524,24334,3217,24546,24011,5308,1565,371,2740,1524,141,2933,4478,11778,141561,1681,371,2740,14537,1524,20713,24561,4039,7957,57472,371,2740,3223,3224,5685,10831,8420,68223,371,2740,3223,3224,86708,1540,8468,371,2740,98,15307,24476,73248,6027,20420,375,371,2740,1129,927,3050,3217,23299,24012,7463,371,2740,98,2163,24012,1524,23299,7485,31102,108077,371,2740,2913,3064,24082,9638,24664,77199,89847,371,2740,9799,141,2285,24801,6790,11271,5244,1564,371,2740,141,3217,20536,18108,7568,9931,371,2740,1524,618,3050,24397,85,7615,5743,371,2740,531,3222,24799,1569,23712,1810,371,2740,2913,20129,24015,1471,102019,1999,371,2740,3223,3224,33998,12798,9831,9942,371,2740,2190,19762,2769,24563,9736,151537,2985,371,2740,3223,3224,86683,24016,6035,76908,371,2740,2913,7255,38051,14817,2414,371,2740,8402,3224,38051,15340,9758,1564,371,2740,531,127,24766,20237,7720,1148,371,2740,2769,8402,8597,2035,29659,14295,371,2740,3223,3224,1757,6904,7486,105284,5308,28350,371,2740,1129,85046,2933,7486,25924,15389,21192,371,2740,14537,3224,23877,362,7498,65342,371,2740,3223,3224,15443,3096,2822,5757,371,2740,24615,6551,271,63533,24018,15548,9694,13832,371,2740,1129,1065,24018,24392,6948,98092,371,2740,3223,3224,2821,2465,17298,8468,4630,371,2740,8402,5760,141,23266,24021,23972,5726,371,2740,2190,2913,3050,24581,34059,3163,151538 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 371,2740,371,2740,403,1424,1216,3452,6407,1216,16,2322,2753,3688,71,2719,16252,2113,2880,2740,371,1752,3452,2405,1990,4016,11925,371,1990,2719,371,4087,4752,2880,4064,11529,371,11925,4087,2880,2740,734,1982,6916,371,2740,2881,273,2740,796,1730,2310,1329,1623,4087,5488,2720,273,371,2322,371,2740,2635,12457,1486,4858,2675,3366,273,2740,7166,2753,10201,623,3967,5291,273,2740,3874,371,851,2976,3797,273,2740,1887,403,570,5483,773,623,3634,5003,3300,1048,14455,620,1623,889,7833,934,273,1216,103,1216,67,1387,760,3954,2176,3570,3536,7833,36467,2814,3930,4016,3158,36467,2814,7833,6120,18388,1828,1216,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 371,2740,1486,67,6682,452,1216,67,371,2740,403,1424,1216,3452,6407,1216,16,2322,2753,3688,71,2719,16252,2113,2880,2740,371,1752,3452,2405,1990,4016,11925,371,1990,2719,371,4087,4752,2880,4064,11529,371,11925,4087,2880,2740,734,1982,6916,371,2740,2881,273,2740,796,1730,2310,1329,1623,4087,5488,2720,273,371,2322,371,2740,2635,12457,1486,4858,2675,3366,273,2740,7166,2753,10201,623,3967,5291,273,2740,3874,371,851,2976,3797,273,2740,1887,403,570,5483,773,623,3634,5003,3300,2566,4254,67,7833,934,273,1216,103,1216,67,1387,24499,3954,2176,3570,3536,7833,36467,2814,3930,4016,3158,36467,2814,7833,6120,18388,39374,1216,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2476,9371,9372,4684,435,377,81,4303,2405,3651,4684,2906,2681,2942,2211,4740,3954,2470,2476,934,50,750,9373,4303,2405,3651,343,9374,50,441,3531,4684,2906,435,377,81,4684,2906,660,4684,856,65,9414,9415,435,9416,2948,3473,4684,4010,2794,377,81,535,377,81,3204,2176,1183,1043,377,294,2176,2176,2566,7046,535,3881,295,7816,3841,2176,1623,377,81,1199,6108,22318,7920,2888,986,1321,2729,1338,660,343,2729,5494,1338,3353,229,889,2729,5962,738,357,2729,371,2729,1327,1661,3838,2729,9378,1661,3838,2729,9377,1661,3838,2729,9378,4684,96,297,1661,3838,2729,9377,4684,96,297,81,9377,2729,81,9378,2729,2729,5962,867,3681,59920,2729,1327,1661,3838,2729,9378,1661,3838,2729,9377,1661,3838,2729,9378,4684,96,297,1661,3838,2729,9377,4684,96,297,2729,5962,867,3681,59920,4729,59920,2729,1327,2488,1327,2729,371,357,24375,3371,584,1661,3838,938,3295,11815,229,9377,867,9378,867,867,867,867,321,889,2729,229,371,3516,321,4171,4729,2729,5413,52,320,67,357,321,1970,81,554,1391,867,81,9378,321,9377,321,4171,898,50,1744,610,3666,314,2087,8180,2729,3568,1008,30274,2729,4536,35075,24272,660,229,4171,105670,357,4171,81,81,1391,535,8400,1661,3841,1978,4740,81,459,2176,4019,6708,620,15418,620,4740,738,3730,738,867,738,4536,377,738,867,4536,377,3730,535,81,81,81,9377,2729,81,9378,2729,4171,50,441,660,459,2176,50,441,660,229,4684,4536,8400,1790,67,81,4536,377,3730,371,330,3697,6522,435,3730,889,2729,5962,352,357,2729,371,2729,1327,1661,3838,2729,9378,1661,3838,2729,9377,1661,3838,2729,9378,4684,96,297,1661,3838,2729,9377,4684,96,297,2729,5962,867,3681,59920,2729,1327,1661,3838,2729,9378,1661,3838,2729,9377,1661,3838,2729,9378,4684,96,297,1661,3838,2729,9377,4684,96,297,2729,5962,867,3681,59920,4729,59920,2729,1327,2488,1327,2729,371,357,24375,3371,321,2729,435,371,3516,321,4171,4729,2729,5413,52,320,67,357,321,1970,81,554,1391,867,81,9378,321,9377,321,4171,898,50,1744,610,3666,314,2087,8180,2729,3568,1008,30274,2729,4536,35075,24272,660,229,4171,105670,357,4171,81,352,2425,3730,4171,81,4171,50,441,4536,2467,660,4171,229,4684,4536,459,1131,4684,4536,377,229,50,441,660,435,5286,660,371,321,2729,5962,898,50,1744,610,35075,24272,660,35075,24272,229,5962,9378,2729,2396,5974,9378,809,321,889,660,9378,2729,2396,5974,9378,809,357,738,1853,889,660,357,738,1853,889,9378,2729,2396,5974,9378,809,1009,660,9378 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 99649,686,4896,223,904,686,4896,2681,2942,2211,4740,3954,2470,2476,934,3694,686,4896,1228,99649,1228,229,904,934,3440,1228,3618,397,3914,5593,1388,2566,3458,3038,253,377,81,15680,46,19194,6465,9067,223,113,8032,4225,2028,805,4758,113,229,4289,3694,2211,6631,1921,4289,3694,555,2322,3694,223,904,1078,3701,441,1065,3222,1172,1146,3206,3207,1228,15680,19194,9067,8032,805,15796,346,346,346,24259,371,346,346,346,346,2125,346,346,346,2292,1143,223,904,4886,1826,1228,99649,223,13927,1970,695,1048,3570,67,273,1420,867,502,2927,1871,9,10,4848,1228,6801,11831,9098,106,1048,5962,660,2991,4848,1228,773,2476,934,5569,154,5313,2211,3158,2476,2814,103072,1668,18700,99649,10,1146,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1146,371,7817,371,9370,39578,22328,9437,39687,2775,28099,24259,7825,3436,11837,39582,21413,4446,19361,269,2814,14643,3836,1146,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 24259,371,904,3519,1196,2974,3454,371,3519,1196,2974,623,1196,3453,371,1222,2602,3310,437,1381,1409,435,1196,2753,904,3542,3241,3797,3888,8181,3448,730,546,287,3519,3366,1477,3519,437,1381,1196,2927,1877,3946,413,113,1196,7146,3872,3519,1196,4218,28055,13838,3454,3565,437,623,375,3050,944,3519,1196,3454,3565,437,623,375,371,3519,1196,3453,437,1196,3334,3214,6182,20890,623,2974,3454,3472,437,437,3014,8435,1720,555,3334,3472,3563,1196,2868,1729,437,95070,27011,4004,95070,27011,4004,705,262,558,4004,705,262,558,4004,3050,944,3563,1196,34550,4004,997,4348,192,4004,31657,192,4004,24481,4004,24481,4004,16036,1269,4004,16036,1269,4004,70524,20175,4004,70524,20175,4004,20577,4004,7750,1269,4004,4236,26889,4004,94726,1269,4004,104320,1628,1994,558,4004,95097,4809,30422,4004,39500,91,4004,162802,4004,78863,2942,4004,13964,74,371,3050,14297,3519,1196,3043,371,1752,557,558,623,3455,1970,3027,2719,3310,438,67,371,3519,1196,1409,67,437,3334,3454,3472,1409,67,4254,3454,3472,1142,3039,24259,371,2740,3223,3224,5713,1146,3276,24259,371,287,2058,557,437,452,656,3222,10908,3064,5713,1146,3027,163,1476,10093,24259,371,2740,3930,3158,10012,24259,2814,2974,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2918,147,457,28099,371,1146,3784,1006,2918,147,457,28099,371,1146,3516,229,9,10,951,1698,904,598,214,362,6038,2742,1196,528,1016,738,2419,440,336,180,463,1530,1610,903,1955,1270,1238,338,8918,1405,53,230,2508,1897,271,1306,271,615,271,409,271,300,531,99,531,1243,212,38,308,1018,8138,832,98,99,98,1243,157,1005,2726,7566,1130,425,1129,1130,1983,1966,3516,371,9370,371,1146,39578,371,1146,39579,371,1146,22328,371,1146,9437,371,1146,39687,371,1146,1560,11132,371,1146,2775,371,1146,1626,371,1146,28099,371,1146,24259,371,1146,7825,371,1146,3436,11837,371,1146,39582,371,1146,21413,371,1146,3516,3281,9370,12770,1146,59019,1146,39757,1146,27256,1146,27146,273,1146,85,21459,1146,19549,20175,1146,1107,2161,1146,1000,1146,20641,192,1146,120642,1146,24019,1146,9993,1146,2272,1146,1019,5680,1146,52228,1146,25074,1146,2359,1269,1146,1951,1146,20649,1146,16687,1146,23432,1146,11191,1146,52509,1146,839,21373,273,1146,6272,91,1146,70524,1146,15796,1146,33992,1146,20716,192,1146,2176,1146,5906,192,1146,60047,1146,20483,1146,1172,1146,120643,20577,1146,2783,1146,2783,192,1146,52292,1146,548,8505,1146,2125,1146,39753,1146,3204,578,1146,3421,4659,1146,86762,1146,98,5713,1146,5230,1146,28259,1146,39744,1146,5713,1146,52511,1146,39748,1146,351,1146,16241,1146,21413,1146,12464,760,3513,2991,1950,1256,55094,4308,3600,3531,4308,2817,773,172,3896,10151,3893,2864,1048,3227,16073,6213,695,1424,3162,3162,3300,464,3162,1143,146,3634,3162,1143,146,3634,464,3499,5986,3162,2292,2918,2737,259,640,1698,1933,3419,147,9488,2722,3249,2968,9488,660,3031,3914,3531,867,3784,1006,2918,147,457,326,2817,773,1766,5962,147,1882,2737,6235,1463,243,259,640,1698,1933,2918,5962,773,7338,3348,3313,2817,620,3841,4934,11730,5327,2968,780,4934,1043,377,3496,1006,3334,2470,101,4673,660,5511,21367,441,5569,3522,2211,934,3158,1006,2814,3731,1146,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 21907,371,2740,3348,21907,2814,21838,6120,459,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 21907,371,2740,3348,21907,2814,21838,6120,459,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2918,147,457,3436,11837,371,1146,3784,1006,2918,147,457,3436,11837,371,1146,3516,229,9,10,951,1698,904,598,214,362,6038,2742,1196,528,1016,738,2419,440,336,180,463,1530,1610,903,1955,1270,1238,338,8918,1405,53,230,2508,1897,271,1306,271,615,271,409,271,300,531,99,531,1243,212,38,308,1018,8138,832,98,99,98,1243,157,1005,2726,7566,1130,425,1129,1130,1983,1966,3516,371,9370,371,1146,39578,371,1146,39579,371,1146,22328,371,1146,9437,371,1146,39687,371,1146,1560,11132,371,1146,2775,371,1146,1626,371,1146,28099,371,1146,24259,371,1146,7825,371,1146,3436,11837,371,1146,39582,371,1146,21413,371,1146,3516,3281,9370,12770,1146,59019,1146,39757,1146,27256,1146,27146,273,1146,85,21459,1146,19549,20175,1146,1107,2161,1146,1000,1146,20641,192,1146,120642,1146,24019,1146,9993,1146,2272,1146,1019,5680,1146,52228,1146,25074,1146,2359,1269,1146,1951,1146,20649,1146,16687,1146,23432,1146,11191,1146,52509,1146,839,21373,273,1146,6272,91,1146,70524,1146,15796,1146,33992,1146,20716,192,1146,2176,1146,5906,192,1146,60047,1146,20483,1146,1172,1146,120643,20577,1146,2783,1146,2783,192,1146,52292,1146,548,8505,1146,2125,1146,39753,1146,3204,578,1146,3421,4659,1146,86762,1146,98,5713,1146,5230,1146,28259,1146,39744,1146,5713,1146,52511,1146,39748,1146,351,1146,16241,1146,21413,1146,12464,760,3513,2991,1950,1256,55094,4308,3600,3531,4308,2817,773,172,3896,10151,3893,2864,1048,3227,16073,6213,695,1424,3162,3162,3300,464,3162,1143,146,3634,3162,1143,146,3634,464,3499,5986,3162,2292,2918,2737,147,9488,2722,3249,2968,9488,660,3031,3914,3531,867,3784,1006,2918,147,457,326,2817,773,1766,5962,147,1882,2737,6235,1463,243,259,640,1698,1933,2918,5962,773,7338,3348,3313,2817,620,3841,4934,11730,5327,2968,780,4934,1043,377,3496,1006,3334,2470,101,4673,660,5511,21367,441,5569,3522,3522,2211,934,3158,1006,2814,3731,1146,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3784,1006,5962,334,39582,371,1146,3716,3663,3784,1006,5962,334,39582,371,1146,3716,3663,3516,229,951,1698,904,598,214,362,6038,2742,1196,528,1016,738,2419,440,336,180,463,1530,1610,903,1955,1270,1238,338,8918,1405,53,230,2508,1897,271,1306,271,615,271,409,271,300,531,99,531,1243,212,38,308,1018,8138,832,98,99,98,1243,157,1005,9,10,2726,7566,1130,425,1129,1130,1983,1966,904,563,435,25074,1146,13916,1722,1723,3159,1146,1172,15796,1146,5713,1146,3730,21413,1146,3730,904,371,9370,371,1146,39578,371,1146,39579,371,1146,22328,371,1146,9437,371,1146,39687,371,1146,1560,11132,371,1146,2775,371,1146,1626,371,1146,28099,371,1146,24259,371,1146,7825,371,1146,3436,11837,371,39582,371,1146,21413,371,1146,12464,760,3513,2991,695,5930,3499,3732,3341,172,3896,10151,3893,2864,1048,3227,16073,6213,695,660,3716,554,172,29138,58443,13924,146,3634,3706,1752,3499,3300,464,1399,2863,371,3938,2863,371,3169,2863,371,2339,11948,2485,3062,2485,469,7286,2863,371,67,2292,2863,371,961,1780,2863,371,557,558,881,9358,1748,329,4010,452,3295,929,1766,326,2863,371,3488,2701,3694,929,5288,452,3419,852,452,533,2366,931,31,2164,3506,4025,7104,14039,452,287,3451,9488,2722,3249,2968,867,3784,1006,3496,1006,3334,2470,101,4673,660,5511,21367,441,5569,3522,3522,2211,934,3158,1006,2814,3731,1146,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 904,371,9370,371,1146,39578,371,1146,39579,371,1146,22328,371,1146,9437,371,1146,39687,371,1146,1560,11132,371,1146,2775,371,1146,1626,371,1146,28099,371,1146,24259,371,1146,7825,371,1146,3436,11837,371,39582,371,1146,21413,371,1146,3158,1006,2814,3731,3732,1146,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 9370,371,1146,39578,371,1146,39579,371,1146,22328,371,1146,9437,371,1146,39687,371,1146,1560,11132,371,1146,2775,371,1146,1626,371,1146,28099,371,1146,24259,371,1146,7825,371,1146,3436,11837,371,1146,39582,371,1146,21413,371,1146,3158,1006,2814,3731,3732,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3784,1006,5962,334,904,3716,3663,3784,1006,5962,334,904,3716,3663,3516,229,951,1698,904,598,214,362,6038,2742,1196,528,1016,738,2419,440,336,180,463,1530,1610,903,1955,1270,1238,338,8918,1405,53,230,2508,1897,271,1306,271,615,271,409,271,300,531,99,531,1243,212,38,308,1018,8138,832,98,99,98,1243,157,1005,9,10,2726,7566,1130,425,1129,1130,1983,1966,904,563,435,25074,1146,13916,1722,1723,3159,1146,1172,15796,1146,5713,1146,3730,21413,1146,3730,904,371,9370,371,1146,39578,371,1146,39579,371,1146,22328,371,1146,9437,371,1146,39687,371,1146,1560,11132,371,1146,2775,371,1146,1626,371,1146,28099,371,1146,24259,371,1146,7825,371,1146,3436,11837,371,39582,371,1146,21413,371,1146,12464,760,3513,2991,695,5930,3499,3732,3341,172,3896,10151,3893,2864,1048,3227,16073,6213,695,660,3716,554,172,29138,58443,13924,146,3634,3706,1752,3499,3300,464,1399,3938,3169,2339,11948,2485,3062,2485,469,7286,67,961,1780,557,558,881,9358,1748,329,4010,452,623,1528,929,1766,326,3488,2701,3694,929,5288,452,852,452,623,1528,533,2366,931,31,623,1528,2164,3506,4025,623,1528,7104,14039,452,287,3451,623,1528,20951,48777,2000,25133,2948,3092,40,9488,2722,3249,2968,867,3784,1006,3496,1006,3334,2470,101,4673,660,5511,21367,441,5569,3522,3522,2211,934,53842,1006,2814,3731,1146,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 904,371,9370,371,1146,39578,371,1146,39579,371,1146,22328,371,1146,9437,371,1146,39687,371,1146,1560,11132,371,1146,2775,371,1146,1626,371,1146,28099,371,1146,24259,371,1146,7825,371,1146,3436,11837,371,39582,371,1146,21413,371,1146,3158,1006,2814,3731,1146,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 904,371,9370,371,1146,39578,371,1146,39579,371,1146,22328,371,1146,9437,371,1146,39687,371,1146,1560,11132,371,1146,2775,371,1146,1626,371,1146,28099,371,1146,24259,371,1146,7825,371,1146,3436,11837,371,39582,371,1146,21413,371,1146,3158,1006,2814,3731,3732,1146,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2918,147,457,2846,1146,3784,1006,2918,147,457,2846,1146,3516,229,9,10,951,1698,904,598,214,362,6038,2742,1196,528,1016,738,2419,440,336,180,463,1530,1610,903,1955,1270,1238,338,8918,1405,53,230,2508,1897,271,1306,271,615,271,409,271,300,531,99,531,1243,212,38,308,1018,8138,832,98,99,98,1243,157,1005,2726,7566,1130,425,1129,1130,1983,1966,3516,371,9370,371,1146,39578,371,1146,39579,371,1146,22328,371,1146,9437,371,1146,39687,371,1146,1560,11132,371,1146,2775,371,1146,1626,371,1146,28099,371,1146,24259,371,1146,7825,371,1146,3436,11837,371,1146,39582,371,1146,21413,371,1146,3516,3281,9370,12770,1146,59019,1146,39757,1146,27256,1146,27146,273,1146,85,21459,1146,19549,20175,1146,1107,2161,1146,1000,1146,20641,192,1146,120642,1146,24019,1146,9993,1146,2272,1146,1019,5680,1146,52228,1146,25074,1146,2359,1269,1146,1951,1146,20649,1146,16687,1146,23432,1146,11191,1146,52509,1146,839,21373,273,1146,6272,91,1146,70524,1146,15796,1146,33992,1146,20716,192,1146,2176,1146,5906,192,1146,60047,1146,20483,1146,1172,1146,120643,20577,1146,2783,1146,2783,192,1146,52292,1146,548,8505,1146,2125,1146,39753,1146,3204,578,1146,3421,4659,1146,86762,1146,98,5713,1146,5230,1146,28259,1146,39744,1146,5713,1146,52511,1146,39748,1146,351,1146,16241,1146,21413,1146,12464,760,3513,2991,1950,1256,55094,4308,3600,3531,4308,2817,773,172,3896,10151,3893,2864,1048,3227,16073,6213,695,1424,3162,3162,3300,464,3162,1143,146,3634,3162,1143,146,3634,464,3499,5986,3162,9488,2722,3249,2968,9488,660,3031,3914,3531,867,3784,1006,2918,147,457,326,2817,773,1766,5962,147,1882,2737,6235,1463,243,259,640,1698,1933,2918,5962,773,7338,3348,3313,2817,620,3841,4934,11730,5327,2968,780,4934,1043,377,3496,1006,3334,2470,101,4673,660,5511,21367,441,5569,3522,3522,2211,934,3158,1006,2814,3731,1146,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 5587,371,5587,371,7817,8435,3948,34706,229,303,80164,6566,6566,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 371,2740,261,2312,40,303,1078,4920,5799,3870,3233,3897,1945,24499,3881,2701,1043,3531,3870,5779,2316,3881,67,1111,934,1335,2935,5313,1335,3304,1335,3304,1335,3304,1335,3304,1232,2209,452,353,751,1959,8123,6371,8182,2209,9148,223,2209,452,25750,4920,250,230,4511,559,1125,4511,645,250,403,250,6649,645,1250,21258,535,1139,1407,2312,3797,826,560,221,902,5969,1476,959,1232,6684,396,1232,561,4990,4920,67,491,610,4990,3658,35,902,717,1526,3658,153,154,6096,1832,230,494,926,1959,8123,6371,8182,334,773,190,560,533,1526,1222,1232,52,1735,751,35,1871,2263,717,442,1526,1761,1496,873,7309,1288,230,21258,535,613,2627,230,4024,1351,1222,2273,2023,443,223,711,148,219,299,13899,2073,2073,52,610,219,2871,3696,16,2073,221,3488,1567,334,773,5320,219,10971,560,2073,3349,5206,221,2794,3488,1567,3573,4568,2789,2238,438,5206,3648,452,610,3629,5615,560,393,2238,438,2211,610,120,4638,3514,2974,491,371,2740,261,2312,40,371,261,2312,40,40,435,554,371,273,1501,1143,3207,1143,1141,1632,554,20163,20164,425,141,1978,1979,24952,141,3223,3224,37891,26887,212,3223,3224,29447,15551,15307,2731,4187,4615,141,3223,3224,1184,88214,91,141,3223,3224,1400,1761,1496,14537,6551,3223,3224,100637,1607,14710,1568,3223,3224,2390,1033,273,2913,141,9707,88210,2913,141,3223,3224,11530,55416,7468,82,4615,54195,2913,3105,9897,3105,14537,3223,3224,47713,70691,2913,141,27362,55424,2913,141,25461,708,2913,6551,2637,325,8515,6551,3223,3224,5461,4180,2789,1524,2913,141,4843,192,151266,12739,141,3223,3224,21304,110233,47908,141,3223,3224,1269,27769,2705,141,1472,4053,20840,3223,3224,9588,3393,8373,2705,141,3223,3224,839,42961,14537,1524,1890,583,5965,91,14537,6551,3223,3224,1126,20214,141,1524,3223,3224,1277,7675,2705,214,14537,1366,1130,273,9326,141,3223,3224,55266,1230,14537,3223,3224,63387,579,24815,1265,2913,3223,3224,80,2846,529,3129,3223,3224,28327,28327,15307,3223,3224,88006,24170,2913,141,91,24676,1524,57070,141,5410,55423,1524,2913,3223,3224,1998,30377,14537,3223,3224,106241,9159,14537,5842,14156,529,45932,2913,3050,3223,3224,9056,82,4615,53,15386,7553,91,3223,3224,106242,1565,141,3217,7254,15114,2913,1195,1949,2025,14537,2166,6859,2913,141,3223,3224,5744,1206,1496,2913,141,3223,3224,1999,55421,20725,14537,2017,15734,1965,21304,3223,3224,4560,15443,1524,14537,3223,3224,2597,13907,1978,4439,14537,3223,3224,405,55413,2913,141,1247,1055,3223,3224,28914,15329,141,5587,88212,88213,14537,3223,3224,192,8737,1247,1229,36331,55427,14537,6277,3223 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 463,371,2740,2322,1970,463,371,2740,40,14471,371,2740,287,1229,3223,3224,9698,8268,2240,371,2740,3050,3223,3224,5392,8268,130086,371,2740,130086,3050,114209,8268,117750,371,2740,32941,8268,18394,371,2740,6485,7670,18394,8268,14710,371,2740,1524,3050,25063,8268,1882,17603,371,2740,1524,3050,20504,8268,24672,371,2740,229,3050,24672,8268,19221,371,2740,1524,19221,3222,24956,8268,23940,371,2740,14537,6278,3223,3224,1466,8268,19657,4659,371,2740,1524,141,13686,5131,839,8268,11767,371,2740,10908,141,3223,3224,18168,8268,9638,371,2740,371,8402,6421,141,30569,273,8268,13742,371,2740,1524,3223,3224,13742,8268,24015,371,2740,141,1576,8268,2930,371,2740,2930,141,30639,8268,29972,33099,371,2740,425,4663,273,8268,24016,371,2740,2913,141,13686,1524,24016,8268,53585,371,2740,1524,12441,3223,3224,271,13465,8268,3992,371,2740,425,3223,3224,28406,8268,15340,371,2740,141,3223,3224,4925,8268,8459,371,2740,827,141,6278,3223,3224,124592,8268,1373,371,2740,3223,3224,1373,8268,7226,371,2740,15307,12934,8268,3295,1004,371,2740,1247,141,3217,36242,8268,3419,2447,371,2740,8402,1229,6369,8268,5660,371,2740,2913,24055,8268,2742,371,2740,1524,2913,26237,8268,8273,8274,371,2740,2913,3223,3224,26231,8268,13597,371,2740,1269,3222,13686,6182,3425,839,8268,20519,371,2740,1065,14537,20519,8268,55180,371,2740,14537,3223,3224,70566,8268,2538,371,2740,11211,3223,3224,1129,4490,8268,1618,371,2740,2913,770,273,8268,1568,371,2740,14537,6277,3223,3224,13465,8268,9380,5669,371,2740,336,3223,3224,15114,8268,9210,371,2740,27403,1472,8268,28330,371,2740,3222,28330,355,8268,16726,371,2740,141,16726,355,8268,1565,371,2740,2846,3223,3224,9849,273,8268,9216,371,2740,229,141,3223,3224,8837,8268,24952,371,2740,6711,14537,3223,3224,79820,8268,618,371,2740,3222,18286,8268,7640,371,2740,1524,425,3223,3224,303,2097,8268,5652,371,2740,17867,129971,8268,4546,371,2740,2913,3223,3224,1243,273,8268,12783,371,2740,66026,141,12783,4348,8268,463,371,2740,1247,14537,3223,3224,33948,8268,6845,371,2740,19923,100348,8268,2469,371,2740,141,2769,10032,8268,1472,371,2740,1247,12566,141,3223,3224,6275,8268,1988,371,2740,20519,141,3223,3224,463,273,8268,5715,371,2740,2913,141,3223,3224,100343,8268,62654,371,2740,2913,141,100333,8268,51087,371,2740,229,141,70563,8268,6904,371,2740,3295,3223,3224,62654,8268,6904,371,2740,14537,3223,3224,1607,1366,8268,6797,371,2740,141,5842,2930,20516,8268,27812,371,2740,2913,3223,3224,100346,8268,12030,371,2740,49451,14537,28334,8268,7937,371,2740,14537,2465,20516,8268,1366,371,2740,1029 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1726,229,1887,9252,4758,1970,438,32,2322,229,2740,1018,1249,1371,2691,3926,1887,16,1018,229,1887,1799,9252,403,438,32,2322,229,2740,3633,5334,12382,3224,6140,4016,3852,4016,332,3852,5236,3341,1799,1970,403,11759,1351,605,3633,3343,1799,9252,403,438,32,2322,229,2740,5334,12382,3224,3852,4016,3189,3852,3852,2046,3308,3852,3852,3189,3308,3852,1799,9252,403,438,32,2322,229,2740,459,32,2322,4930,26422,3852,3224,1799,9252,403,438,32,40,229,2740,4044,12382,3224,1969,3852,332,664,3852,3852,4357,3419,3308,3852,1799,9252,403,438,32,2322,229,2740,13751,12382,3852,332,664,459,16700,3852,3852,4357,3419,3308,459,16700,3852,3224,1969,3852,4016,6140,459,3852,1799,9252,403,438,32,2322,229,2740,10169,570,4254,4930,3224,3224,1969,3268,14455,570,971,54141,14455,1799,9252,403,438,32,2322,229,2740,605,5334,12382,3852,332,2934,16700,3852,3852,2934,2922,16700,3852,3852,4357,16700,3852,3852,4357,3419,2046,16700,3852,1799,9252,403,438,32,40,229,2740,605,4254,8756,3224,3224,19762,371,50949,371,927,371,3224,20214,371,3224,11771,371,62143,371,2538,371,3224,1568,371,9856,371,754,371,2718,371,3224,1969,27748,371,1486,371,425,371,20567,371,300,371,1799,9252,403,438,32,2322,229,2740,403,11759,1351,605,3633,3343,3852,3224,3633,5334,3852,1799,9252,403,438,32,2322,229,2740,2228,2389,4468,2331,605,3852,3224,1969,1799,9252,403,438,32,2322,229,2740,3694,5334,8770,3819,7647,3343,12382,3224,1969,3852,332,664,3852,3852,4357,3419,3308,3852,1623,403,1424,7924,1424,1018,1249,1371,2691,3906,3850,3537,287,67,3158,71229,229,1726,22609,4125,9252,17516,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 4017,2566,934,2681,3930,1335,4132,151491,5618,3011,553,568,1752,773,560,2211,975,1582,4017,2566,904,371,2740,9370,371,1626,371,39578,371,28099,371,39579,371,24259,371,22328,371,7825,371,9437,371,3436,11837,371,39687,371,39582,371,1560,11132,371,21413,371,2775,371,5569,535,3522,2322,2740,904,148,5565,3158,151471,229,1146,21585,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 57653,626,934,2681,3930,1335,4132,151491,5618,3011,553,568,1752,773,560,2211,975,1582,4017,2566,57653,2740,39579,371,1524,427,3222,25074,1146,57653,39579,371,2740,1483,151491,2871,1222,373,904,2886,371,371,2740,7151,57653,3670,1007,287,3451,1145,904,106,1859,2944,25074,5569,535,3522,2322,2740,904,148,5565,3158,151471,229,1146,21585,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 371,2740,98,1243,371,11925,371,2740,764,727,371,553,727,437,623,570,5480,553,371,3486,2740,623,3612,3779,2549,437,623,371,273,15,1196,2616,1196,3483,3455,557,558,623,3516,3025,371,1826,1524,371,32651,1141,273,2697,554,175,1501,100945,30563,12898,3223,3224,155854,8411,6059,3223,3224,28468,9847,8598,9281,3223,3224,2127,30707,28304,6623,175467,3223,3224,31294,10831,2150,47280,14537,10831,1540,9837,164755,3295,1744,141,20262,28290,7854,119158,3223,3224,35432,7222,9831,10968,752,3223,3224,17186,192,1965,24664,14537,3372,28260,137825,24179,125241,3223,3224,24439,273,770,5210,37654,166799,3223,3224,839,26793,583,5308,85732,3223,3224,583,15340,933,9056,2913,2933,53850,115710,4324,24660,14537,6279,26718,23746,10034,92428,3223,3224,9219,124349,2390,7463,5739,303,721,3129,2390,18629,7471,4417,1524,141,6044,7947,8685,3223,3224,9849,20612,8468,144307,3223,3224,3809,839,8791,1029,8479,3223,3224,4439,839,2272,4324,3223,3224,39468,1524,5244,22240,3223,3224,36109,529,4130,58726,529,2252,1265,48603,20816,3810,3223,3224,154680,14791,2414,106464,1524,14537,80770,3087,9718,17358,3223,3224,12282,7700,6803,3223,3224,9733,24763,33211,7931,3223,3224,100646,1162,24722,14537,2528,9779,7600,128190,3223,3224,9439,4277,14796,3223,3224,7222,5653,17543,78932,1524,652,13640,9221,8561,2528,33534,6551,94844,34162,8470,8804,131527,3223,3224,154681,117529,1540,3223,3224,154682,172478,14789,3223,3224,155855,10770,5715,1389,20420,3223,3224,154685,33187,108582,3223,3224,6567,66016,34608,6028,18961,1524,355,141,1366,5014,18289,3223,3224,56166,1277,4324,19975,1524,16207,13413,4324,3223,3224,53886,4324,8541,3223,3224,6847,9219,2768,7612,152584,3223,3224,8524,9219,114055,16151,3223,3224,36191,8099,3786,24677,30620,67296,7947,1269,3223,3224,579,529,4662,9758,7316,3223,3224,5652,56162,23960,7957,1243,14537,28313,1496,11563,4471,583,3223,3224,53597,9561,79910,141,782,141,5934,273,4879,9848,8790,3223,3224,27485,15353,14817,17344,37454,9758,86227,14537,1524,53665,7598,19043,3223,3224,38011,4368,4130,58726,529,2252,1265,60148,9561,6967,1524,14537,45724,7945,6028,9668,3223,3224,3061,13640,2428,3163,13163,3223,3224,154686,9351,24919,39683,3223,3224,13657,30938,24919,39683,3223,3224,13657,1489,9427,7973,3223,3224,9521,87954,4039,26315,3223,3224,1692,2025,113752,7600,62989,3223,3224,39049,2878,15504,3223,3224,53692,1130,92428,3223,3224,109162,295,2211,2913,2176,98,1243,393,106639,1524,299,437,623,610,2190,652,141436,1524,13640,8032,623,2211,437,623,610,3158,229,8032,11925,2740,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 59,2426,626,934,2681,3930,1335,4132,151491,5618,3011,553,568,1752,773,560,2211,975,1582,4017,2566,59,2426,2740,39582,371,2534,3050,2783,1146,59,2426,1933,904,3780,2783,1329,4834,2322,39582,371,2740,2881,373,904,2740,2886,3192,412,2322,2426,3797,1780,2864,1329,4507,373,39582,3797,1766,2998,7557,2012,546,1432,5525,5124,5936,3146,25955,5918,92,8056,8106,7851,1329,413,505,9633,1423,67270,1423,5569,535,3522,2322,2740,904,148,5565,3158,151471,229,1146,21585,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2616,152,1970,2998,103,3307,2616,3547,2188,152,34193,2616,3547,152,883,971,1960,6697,3223,3224,882,883,2740,1704,61918,1501,10562,2616,3547,152,2695,259,118171,6278,882,883,2740,15389,133481,1501,3223,3224,27059,883,2740,6791,142786,1501,64184,19535,409,3696,28551,30334,2868,6278,2933,882,883,2740,94267,21244,4883,2211,1832,1501,14911,28551,17631,14537,6278,882,883,2740,26211,33241,1501,28299,613,1960,4587,15821,741,28299,883,2740,6368,9710,1501,882,28650,2187,147,4659,20175,6277,882,883,2740,4130,34039,43970,1501,882,271,633,3715,3277,4677,51098,633,4857,6278,882,883,2740,770,13047,1501,882,466,851,2886,28551,3050,6277,882,883,2740,5014,21249,1501,882,323,9456,7149,233,3281,6278,882,883,2740,1212,30499,1501,259,2979,3072,3696,883,28551,3223,3224,882,883,2740,1757,5726,1501,259,1780,4677,28551,141,2000,6038,14537,6277,425,426,2740,8341,2014,71355,1501,259,3257,2886,883,28551,9994,6278,882,883,2740,1389,1501,2911,475,2021,883,3223,3224,882,883,2740,4477,58950,5746,1501,1929,23953,3748,958,80045,3436,2582,883,2740,9582,23953,1501,2982,28300,371,2866,152,3223,3224,882,883,2740,6010,1501,53005,53006,883,151481,229,28551,3223,3224,882,883,2740,6051,19984,8507,1501,457,764,763,71,2211,1832,124658,3223,3224,240,24435,883,2740,9400,6904,1501,3436,9633,6278,882,883,2740,7784,151482,1501,883,3223,3224,3436,2582,883,2740,7677,15663,1501,633,883,4857,6278,882,883,2740,770,13047,1501,1065,883,1087,3696,3223,3224,882,883,2740,2244,5637,1501,2911,30190,371,2187,147,1169,146,15548,7943,3129,8285,883,2740,51033,76924,1501,3032,10562,71,25971,2868,6278,2933,882,883,2740,4471,98259,3161,1501,152,5767,7368,3223,3224,28248,3746,2740,7553,29553,1501,152,1105,11931,644,863,3718,741,3436,2582,883,2740,1689,63167,1501,152,2996,5279,6017,2868,6278,3217,882,883,2740,507,36450,1501,20473,371,28650,2187,147,1560,6028,757,12,883,2740,30563,10102,1501,4769,2113,2886,271,409,98,652,141,5842,425,426,2740,316,1501,4769,4784,6697,152,98,652,141,5842,425,426,2740,7485,145033,1501,4769,2188,271,409,548,11827,6278,882,883,2740,8468,9897,1501,4769,147,4515,2190,513,3695,4515,883,2740,3197,1501,4769,147,30190,371,3223,3224,8285,883,2740,4039,9424,7220,1501,2911,4619,2616,1712,152,1300,3223,3224,1019,19443,3746,2740,625,1501,7955,1970,883,6038,6277,425,426,2740,60993,3416,1501,28650,2187,147,1277,371,6697,958,3223,3224,30025,883,2740,7612,1524,91,1501,3118,1570,28650,2187,147,28551,4710,741,2064,883,2740,6054,8448,1501,2944,882 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3282,3656,535,623,645,3930,560,904,393,553,645,826,555,3223,3224,1172,1146,1172,3219,780,3210,3648,457,330,103,645,3027,4740,645,1143,3210,3907,931,154,1143,21734,29,173,3907,21600,229,386,273,386,295,2176,2292,386,555,3027,1476,3224,3586,2029,570,2454,555,114,7894,3615,3235,645,67,457,330,33571,330,2029,3039,1141,2029,457,1131,2029,3553,457,881,1131,620,2720,773,1524,7366,645,1746,273,645,574,555,114,457,330,3039,1141,386,229,645,386,567,2029,457,330,1131,1746,457,1131,1856,5787,645,2942,273,386,567,2029,3310,794,645,1676,273,393,2549,3282,3656,623,1746,645,273,1970,273,1784,560,3528,386,3027,3586,4401,273,295,671,386,163,1476,10093,904,393,553,3027,3216,386,567,535,623,20808,2889,2028,3648,457,330,330,330,1430,3050,20888,3050,330,3223,3224,17484,273,371,229,1632,554,3780,1501,457,1501,2366,555,5581,793,1131,457,881,457,33571,330,3050,273,457,390,640,453,6031,20888,371,1476,1746,1131,3050,330,3223,3224,17484,229,6031,3027,2600,1632,554,555,1002,1381,67,330,330,6185,1430,931,154,330,1381,2896,373,10201,330,7643,2896,4507,373,330,2896,729,330,2896,2740,555,1131,403,330,1766,1832,2211,3050,273,36655,20888,229,3050,330,3223,3224,17484,1632,554,1501,555,6122,645,2021,1103,271,261,2312,1506,6031,1476,930,229,3576,229,3349,645,589,826,1089,394,11289,3270,2021,3471,645,826,555,555,7890,273,645,3586,4401,273,2292,386,3896,1524,1524,1524,2292,386,1524,1524,1524,2028,4225,457,273,2292,386,1524,1524,1524,2292,386,273,1420,273,1420,273,1420,9370,12770,8975,39757,27256,27146,273,85,21459,52934,19549,20175,1107,2161,20641,192,120642,8548,362,273,24019,9993,2272,13154,66236,1019,5680,52228,7231,2359,1269,52587,22328,15714,1951,9057,8601,13620,9080,8967,45,12676,18279,13049,6840,9076,8722,11611,6736,426,6596,6860,1019,566,8001,32729,22184,13267,2292,16687,23432,24613,582,11191,54527,273,16286,29685,52509,839,21373,6272,91,15691,70524,565,20716,192,2176,5906,192,9521,39758,60047,24259,120643,20577,2783,192,88820,15117,2161,8702,32749,19083,3173,11673,6688,7957,9249,9226,11801,7043,749,8782,7456,9014,22659,1726,9012,5963,9049,9082,57422,13166,2292,3295,52292,88810,548,8505,39753,3204,578,3421,4659,4736,86762,98,5713,121659,141,1029,2846,5230,5741,9053,39744,28039,121698,52511,39748,351,121652,16241,135043,21413,9776,6858,6556,6279,6717,6732,9013,141,17545,8950,12421,10770,6794,3067,2005,6719,23189,13188,8734,8111,9297,9174,12710,18667,2292,640,453,9290,7536,7825,53587,21413,362,529 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2240,371,2740,7566,2239,336,24672,371,2740,531,2913,3050,32985,336,9638,371,2740,3223,3224,24952,336,20484,371,2740,2190,425,20485,336,15340,371,2740,3223,3224,2165,336,2768,371,2740,531,583,141,3064,701,336,24467,371,2740,1129,229,3050,26988,336,57205,371,2740,531,371,209,340,27129,336,59510,371,2740,531,3050,59510,336,1568,371,2740,1568,371,8402,14710,336,9210,371,2740,531,2913,3050,24570,336,9216,371,2740,3223,3224,24014,336,7640,371,2740,1129,355,3050,2104,336,2469,371,2740,1129,26280,3217,10032,336,1564,371,2740,425,3222,18533,336,1540,371,2740,1540,371,8402,303,2450,336,13742,371,2740,531,2913,3050,303,13742,336,5120,371,2740,3223,3224,79848,336,1373,371,2740,1373,371,8402,17942,336,7226,371,2740,3223,3224,6011,336,15484,371,2740,1129,26280,1373,336,9815,371,2740,1247,3050,1224,336,2538,371,2740,98,3050,34694,336,24375,371,2740,531,2913,3050,70691,336,28330,371,2740,2190,425,3050,8252,336,24952,371,2740,3223,3224,55306,336,17272,371,2740,2190,280,3050,102941,336,1472,371,2740,3050,303,7261,336,2866,371,2740,1128,1223,336,3926,371,2740,2913,3050,8488,336,24015,371,2740,24015,371,8402,1130,336,583,371,2740,583,371,8402,862,336,4808,371,2740,3223,3224,27,336,11771,371,2740,3223,3224,26286,336,2272,371,2740,355,3050,65154,336,8448,371,2740,8448,371,8402,10213,336,2044,371,2740,1129,229,3050,67107,336,25461,371,2740,25461,371,8402,102937,336,1565,371,2740,1565,371,8402,102928,336,3385,371,2740,3223,3224,108237,336,6845,371,2740,6845,371,8402,54207,336,615,2884,6564,1129,16837,3050,336,120510,371,2740,531,10273,3050,24409,336,67361,371,2740,2190,1247,3050,67361,336,839,371,8402,531,371,3050,336,6904,371,2740,3223,3224,5760,336,1988,371,2740,3223,3224,16638,336,12170,371,2740,1129,5999,3050,336,30979,371,2740,36174,340,1771,336,24676,371,2740,1129,1366,3050,48741,336,31440,371,2740,98,335,3222,5024,336,1608,371,2740,1608,371,8402,58152,336,5014,371,2740,5014,371,8402,34878,336,18286,371,2740,3223,3224,1277,517,13647,371,2740,98,2913,3050,5660,336,7860,371,2740,3223,3224,8524,336,82229,371,2740,3223,3224,17258,336,108227,371,2740,108227,371,8402,101654,336,862,371,2740,3223,3224,102925,336,7950,371,2740,3223,3224,50829,336,1366,371,2740,531,2913,3050,21727,336,4663,371,2740,4663,3371,8402,17070,336,27469,371,2740,20491,3222,62935,336,20486,371,2740,1129,3050,14350,336,7246,371,2740,98,2913,3050,20504,336,99360,371,2740,99360,371,8402,6814,336,6832,371,2740 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 9854,3916,904,2839,2389,30803,2176,904,2839,2389,9854,3916,22328,371,8402,28099,371,71,355,39579,371,8402,7825,371,8402,2176,9854,3916,904,2839,2389,9370,371,2753,664,46,14659,371,1527,141,1029,435,1229,1033,14,1043,377,3158,3371,9370,1146,10267,1249,3147,9370,640,3776,5917,540,2781,3471,21828,4040,540,4032,234,26999,3344,9370,9370,640,1859,4892,3623,904,4902,3032,4596,3491,2648,271,371,12454,6125,4784,3491,280,1349,664,330,6276,371,9370,640,4736,371,1527,22669,2348,2853,371,71,3453,141,1029,121659,330,371,1527,413,1329,2987,1623,141,1029,4428,3742,271,371,9452,39582,371,3315,371,7108,2888,9370,371,28099,371,3623,9437,22328,371,413,1329,2648,9370,371,3043,1882,22328,529,3280,560,9437,371,9370,371,1031,1761,1630,1351,9048,28099,371,2753,9370,28099,640,453,4482,2316,371,3295,10,1933,259,46,7170,9370,371,287,1351,3480,2603,14,825,2912,9370,371,326,1558,8402,271,371,1280,1155,1986,579,14189,12068,2130,2967,1155,4849,656,4688,1330,8402,1803,3083,8402,3065,1986,6352,1155,1933,656,34340,17867,168,11740,14319,5867,3495,5373,80,6091,711,21655,1490,16966,2627,435,4905,3147,222,781,50680,402,858,2188,2558,14659,271,409,5263,295,21105,330,1720,233,3421,19550,2888,3742,579,233,1354,2627,3122,3742,1574,3266,2749,4160,2898,26855,330,26855,9420,1766,903,6527,1300,5271,3011,548,1980,330,2092,3780,330,2987,60784,141,1029,3526,141,1029,5353,11865,3311,141,1029,3768,2029,330,8524,22669,1354,1668,5353,3780,3745,330,141,1029,3122,121659,330,7640,1265,2018,1419,764,4791,3812,1420,1690,17365,764,330,1420,4387,1131,5373,151496,121659,4391,192,804,25116,1607,10003,904,402,445,3453,10003,111,28099,640,30940,2317,2485,445,24447,4593,343,64,377,24447,934,873,1960,355,53909,5221,4336,4435,226,6567,87249,343,1189,21332,18034,1755,30745,1045,343,91,2821,4236,1420,4019,2465,28099,5320,1652,390,50850,9370,371,9370,640,453,390,6056,233,2627,1607,9370,3295,5933,977,839,5710,91,5187,3403,3742,148814,9370,26848,5081,920,9420,1968,453,8630,3448,3737,506,192,9998,233,1045,1574,3266,435,2749,4160,2898,4788,8647,1145,9370,371,226,6567,87249,15727,4437,5814,4187,18541,21328,3118,1570,2391,3118,10,104,16254,2049,28099,453,1596,555,371,16946,2317,6056,233,9370,640,453,3777,2316,3889,1816,47445,3337,5515,5479,233,15015,7482,4084,1631,3416,4129,4315,839,4456,9988,13903,26923,9994,1045,2753,8630,5906,6127,1183,2898,1249,1371,15727,17276,91,192,141,1029,435,9370,371,71,163278,6279,1129,2013,3223,3224,141,1029,1146 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 904,393,553,645,826,555,3223,3224,1172,1146,1172,3219,780,3282,3656,535,623,645,3930,3210,3648,457,330,103,645,1143,3027,4740,229,386,645,1143,273,386,3210,4004,931,154,1143,21734,29,173,4004,21600,555,3027,1476,3224,3586,2029,570,2454,555,114,7894,3615,3235,645,67,457,330,33571,330,2029,3039,1141,2029,457,1131,2029,3553,457,881,1131,620,2720,773,1524,7366,645,1746,273,645,574,555,114,457,330,3039,1141,3648,457,330,330,330,1430,3050,273,3780,1501,2366,555,5581,793,1131,457,881,1476,1746,1131,457,33571,330,3050,273,2784,3050,330,3223,3224,2200,371,6031,229,1632,554,2784,3050,330,3223,3224,2200,371,229,457,1501,1632,554,295,2176,2292,386,386,229,645,567,2029,457,330,1131,1746,457,1131,1856,5787,645,2942,273,386,567,2029,3310,794,645,1676,273,393,2549,3282,3656,623,1746,645,273,1970,273,1784,560,3528,386,3027,3586,4401,273,295,671,386,163,1476,10093,904,393,553,3027,3216,386,567,535,623,20808,2889,2028,457,390,640,453,555,1002,6031,3027,2600,1381,67,330,330,6185,1430,330,1381,2896,373,10201,330,7643,2896,4507,373,330,2896,729,330,2896,2740,931,154,931,154,931,154,931,154,555,1131,403,330,1766,1832,2211,3050,1141,3223,3224,2200,273,1501,229,1632,554,36655,3282,3656,535,623,645,3930,560,2176,555,6122,645,2021,930,229,3576,229,3349,645,6031,1103,271,261,2312,1506,589,826,1089,394,11289,3270,2021,3471,645,826,555,555,7890,273,645,3586,4401,273,2292,386,3896,273,1420,9370,12770,8975,39757,27256,27146,273,85,21459,52934,19549,20175,1107,2161,20641,192,120642,8548,362,273,24019,9993,2272,13154,66236,1019,5680,52228,7231,2359,1269,52587,22328,15714,1951,554,9057,8601,13620,9080,8967,45,12676,18279,13049,6840,9076,8722,11611,6736,426,6596,6860,1019,566,8001,32729,22184,13267,55002,386,386,2292,386,273,1420,554,386,16687,8702,23432,32749,24613,19083,582,3173,11191,11673,54527,273,6688,16286,7957,29685,9249,52509,839,21373,9226,6272,91,11801,15691,7043,70524,749,565,8782,20716,192,2176,7456,5906,192,9014,9521,22659,39758,1726,3295,60047,9012,24259,5963,120643,20577,9049,2783,192,9082,88820,57422,15117,2161,13166,2292,386,2028,4225,457,273,2292,386,273,1420,52292,88810,548,8505,39753,3204,578,3421,4659,4736,86762,98,5713,121659,141,1029,2846,5230,5741,9053,39744,28039,121698,52511,39748,351,121652,16241,135043,21413,554,9776,6858,6556,6279,6717,6732,9013,141,17545,8950,12421,10770,6794,3067,2005,6719,23189,13188,8734,8111,9297,9174,12710,18667,2292,386,386,2292 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 904,393,553,645,826,555,3223,3224,1172,1146,1172,3219,780,3282,3656,535,623,645,3930,3210,3648,457,330,103,645,1143,3027,4740,229,386,645,1143,273,386,3210,4004,931,154,1143,21734,29,173,4004,21600,555,3027,1476,3224,3586,2029,570,2454,555,114,7894,3615,3235,645,67,457,330,33571,330,2029,3039,1141,2029,457,1131,2029,3553,457,881,1131,620,2720,773,1524,7366,645,1746,273,645,574,555,114,457,330,3039,1141,3648,457,330,330,330,1430,3050,273,2784,3050,330,3223,3224,2200,371,229,1632,554,295,2176,2292,386,386,229,645,567,2029,457,330,1131,1746,457,1131,1856,5787,645,2942,273,386,567,2029,3310,794,645,1676,273,393,2549,3282,3656,623,1746,645,273,1970,273,1784,560,3528,386,3027,3586,4401,273,295,671,386,163,1476,10093,904,393,553,3027,3216,386,567,535,623,20808,2889,2028,3780,1501,435,554,2366,555,5581,793,1131,457,881,457,1501,435,554,1476,1746,1131,457,33571,330,3050,273,2784,3050,330,3223,3224,2200,371,6031,229,1632,554,457,390,640,453,555,1002,6031,3027,2600,1381,67,330,330,6185,1430,330,1381,2896,373,10201,330,7643,2896,4507,373,330,2896,729,330,2896,2740,931,154,931,154,931,154,931,154,555,1131,403,330,1766,1832,2211,3050,1141,3223,3224,2200,273,1501,435,554,229,1632,554,36655,3282,3656,535,623,645,3930,560,2176,555,6122,645,2021,930,229,3576,229,3349,645,6031,1103,271,261,2312,1506,589,826,1089,394,11289,3270,2021,3471,645,826,555,555,7890,273,645,3586,4401,273,2292,386,3896,273,1420,9370,12770,8975,39757,27256,27146,273,85,21459,52934,19549,20175,1107,2161,20641,192,120642,8548,362,273,24019,9993,2272,13154,66236,1019,5680,52228,7231,2359,1269,52587,22328,15714,1951,554,9057,8601,13620,9080,8967,45,12676,18279,13049,6840,9076,8722,11611,6736,426,6596,6860,1019,566,8001,32729,22184,13267,2292,386,386,2292,386,273,1420,554,386,16687,8702,23432,32749,24613,19083,582,3173,11191,11673,54527,273,6688,16286,7957,29685,9249,52509,839,21373,9226,6272,91,11801,15691,7043,70524,749,565,8782,20716,192,2176,7456,5906,192,9014,9521,22659,39758,1726,3295,60047,9012,24259,5963,120643,20577,9049,2783,192,9082,88820,57422,15117,2161,13166,2292,386,2028,4225,457,273,2292,386,273,1420,52292,88810,548,8505,39753,3204,578,3421,4659,4736,86762,98,5713,121659,141,1029,2846,5230,5741,9053,39744,28039,121698,52511,39748,351,121652,16241,135043,21413,554,9776,6858,6556,6279,6717,6732,9013,141,17545,8950,12421,10770,6794,3067,2005,6719,23189,13188,8734,8111,9297,9174 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 904,3488,3307,3993,1752,459,229,4834,1042,3014,2863,287,452,229,1042,1970,2322,2934,2238,438,425,1172,1146,3158,2238,438,229,1146,2238,438,9561,508,2238,438,8207,3585,1086,4834,3889,4140,764,904,2238,438,2881,3187,3648,851,229,10110,464,2936,2238,438,3441,2701,1214,2238,438,2322,2168,3648,5615,2316,229,1216,3246,1528,3241,902,1735,751,221,4990,221,3823,5711,2263,2891,229,1676,3698,3648,5206,3310,229,851,5163,371,2238,1676,221,2238,438,2881,2141,393,221,5561,904,1735,1651,1990,579,2220,1232,4023,1232,287,18085,35,3701,221,748,148,221,1232,4245,371,3553,2238,438,2322,10139,1843,10422,385,371,2238,40,4805,229,221,1407,2238,438,413,3118,3967,2322,567,3532,2238,1827,2899,1329,3192,2348,1990,14,2238,2322,1982,2691,425,1172,1146,3158,9076,229,1146,4087,2132,3086,36209,4087,375,39667,4087,9840,13261,1982,2691,3068,2310,1483,4834,3544,12447,3967,4087,4834,413,1329,2113,2880,4087,5062,12436,4087,4834,438,2348,706,7867,5291,904,1960,393,1472,1172,1146,3158,13996,1146,2814,10061,287,778,20362,76447,2880,22784,393,1960,3446,229,1222,1960,6188,3522,3614,693,10061,287,778,3441,3488,10324,3452,393,10407,5279,4266,452,3452,287,2900,827,15,7411,15,1196,2113,425,3064,1172,1146,3158,2113,229,1146,2113,7927,2251,22784,2113,3187,3441,851,229,4807,3187,402,3112,229,3112,3471,452,9,10,2113,10172,3441,457,851,71,748,402,567,67,3263,3334,3524,2675,5566,40,2113,3779,221,904,30719,3647,2942,2113,3276,1367,3490,3269,603,3492,784,229,4402,3758,2113,5317,20904,2113,4910,3852,1676,2176,2934,904,3488,3307,3993,1752,459,3490,2974,3492,280,60374,29905,25435,2208,8071,26344,1843,8084,1597,4389,4007,2911,221,3461,12230,425,3064,1172,1146,3158,52495,229,1146,3461,12230,2272,2127,11916,764,2881,229,3461,12230,904,103,229,4834,3461,12230,904,229,3461,12230,3449,902,229,1399,554,533,1526,932,287,904,2998,3561,15374,1399,2579,190,3445,2996,533,1526,3532,7709,1258,3030,3445,4162,533,1526,1597,2998,3512,902,5449,229,1399,554,3524,15374,3561,3461,1526,3475,4536,3461,5582,1014,729,229,425,3064,1172,1146,3158,8286,229,1146,729,229,33198,39670,7673,729,229,7781,10141,729,229,8207,3585,1086,4834,3889,4140,764,904,904,729,229,37,9350,2322,2113,2881,3345,2113,2113,229,729,10,2675,5699,10,3187,2348,851,2691,1779,287,3307,4383,7596,940,84754,9511,271,229,221,6982,9511,3488,1567,229,1216,3307,21209,2485,330,2970,620,4281,3501,10378,6972,1729,554,1846,3211,773,229,29,6191,2616,940 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 24259,371,904,929,3025,1969,2934,695,3906,3540,371,2740,2322,3235,4308,13947,8817,2579,3445,959,8974,6860,52,3540,371,3445,52,3632,371,1837,9758,15663,3161,3664,438,229,904,2322,3664,438,1372,16603,7673,3664,438,2934,1222,2602,24259,371,1129,2232,3064,5713,1146,3334,929,3025,1483,1222,856,3013,2030,3190,24259,371,1969,2934,3529,3014,567,71,3190,3531,20,2322,929,3486,13733,381,3537,371,552,52,3501,773,252,552,52,100,29,223,252,2867,221,299,2719,1754,2635,3501,2228,100,29,223,3190,3550,567,773,20,13733,381,371,2030,3190,773,4706,1969,2934,2942,3190,6683,552,52,7000,6249,12162,221,299,3031,773,6092,929,3235,6720,3237,10332,5279,3453,602,5078,552,52,3659,221,299,3540,3609,5811,5962,3540,4254,24259,533,2366,1008,773,3341,3025,8238,6140,3419,3025,3921,7183,67,24259,371,1222,2602,3921,535,3543,2188,3025,3758,287,403,568,3110,253,3691,3906,3027,722,13723,6199,3161,3501,3190,2141,5973,531,2133,3050,3217,1172,904,3207,371,2740,2322,3235,4308,13947,8817,2579,3445,3371,107419,1008,52,602,371,623,403,371,2740,100,5279,3852,2996,3875,3585,535,8817,403,986,959,1008,2753,4308,13947,2942,834,959,1008,5373,5078,52,3237,8322,3246,623,1883,3290,371,2960,371,2740,773,2960,674,3633,4468,1969,371,2740,2322,320,623,5195,6108,1676,629,3210,3468,2947,629,371,623,1883,8096,674,3633,4468,2292,2960,3872,2934,371,2740,3235,4308,20848,623,5195,6108,403,629,403,8045,3503,371,2740,2947,3227,3485,1620,623,1883,3654,674,3633,4468,371,2740,2192,3366,7360,623,3267,3584,104,1407,904,3542,3241,567,371,2740,3366,7360,437,623,3634,1795,3494,986,45099,72209,437,623,959,1008,535,320,3634,378,1309,2958,20848,773,371,2740,2322,163,568,3030,371,623,1883,553,3238,5551,371,2740,4852,3614,2906,1008,6108,2958,3238,773,1111,2254,623,1883,7360,623,553,104,3688,3543,3241,371,2740,834,959,1008,5064,834,959,1008,5474,2560,22890,535,2478,443,203,660,5064,3258,4254,5373,5078,3616,223,2029,7382,5777,1008,2951,4463,3525,8907,52,371,2740,2906,3014,3540,3235,6720,3638,3664,4402,3523,3445,371,2740,834,959,1008,3453,3930,251,3522,3523,2553,1008,793,154,223,154,3616,8907,52,21624,567,7166,174,464,3024,1008,3616,634,154,2228,3341,5279,154,2938,3525,2938,3348,251,3522,3523,1008,3897,2906,2579,3929,3348,223,3525,2029,252,2991,51910,51911,3030,730,17022,4064,5218,959,1008,2992,252,3348,857,5777,856,3589,3540,3666,2911,929,3025,371,8238,4357,371,3445,52,3632,437 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 904,3488,3307,35208,1752,459,229,4834,1042,3014,2863,287,452,229,1042,1970,2322,2934,2238,438,425,1172,1146,3158,2238,438,229,1146,2238,438,9561,508,2238,438,8207,3585,1086,4834,3889,4140,764,904,2238,438,2881,3187,3648,851,229,10110,464,2936,2238,438,3441,2701,1214,124728,438,2322,2168,3648,5615,2316,229,1216,3246,1528,3241,902,1735,751,221,4990,221,3823,5711,2263,2891,229,1676,3698,3648,5206,3310,229,851,5163,371,2238,1676,221,2238,438,2881,2141,393,221,5561,904,1735,1651,1990,579,2220,1232,4023,1232,287,18085,35,3701,221,748,148,221,1232,4245,371,3553,2238,438,2322,10139,1843,10422,385,371,2238,40,4805,229,221,1407,2238,438,413,3118,3967,2322,567,3532,2238,1827,2899,1329,3192,2348,1990,14,2238,2322,1982,2691,425,1172,1146,3158,9076,229,1146,4087,2132,3086,36209,4087,375,39667,4087,9840,13261,1982,2691,3068,2310,1483,4834,3544,12447,3967,4087,4834,413,1329,2113,2880,4087,5062,12436,4087,4834,438,2348,706,7867,5291,904,1960,393,1472,1172,1146,3158,13996,1146,2814,10061,287,778,20362,76447,2880,22784,393,1960,3446,229,1222,1960,6188,3522,3614,693,10061,287,778,3441,3488,10324,3452,393,10407,5279,4266,452,3452,287,2900,827,15,7411,15,1196,2113,425,3064,1172,1146,3158,2113,229,1146,2113,7927,2251,22784,2113,3187,3441,851,229,4807,3187,402,3112,229,3112,3471,452,9,10,2113,10172,3441,457,851,71,748,402,567,67,3263,3334,3524,2675,5566,40,2113,3779,221,904,30719,3647,2942,2113,3276,1367,3490,3269,603,3492,784,229,4402,3758,2113,5317,20904,2113,4910,3308,2176,3852,1676,904,3488,3307,35208,1752,459,3490,2974,3492,280,60374,29905,25435,2208,8071,26344,1843,8084,1597,4389,4007,2911,221,3461,12230,425,3064,1172,1146,3158,52495,229,1146,3461,12230,2272,2127,11916,764,2881,229,3461,12230,904,103,229,4834,3461,12230,904,229,3461,12230,3449,902,229,1399,554,533,1526,932,287,904,2998,3561,15374,1399,2579,190,3445,2996,533,1526,3532,7709,1258,3030,3445,4162,533,1526,1597,2998,3512,902,5449,229,1399,554,3524,15374,3561,3461,1526,3475,4536,3461,5582,1014,729,229,425,3064,1172,1146,3158,8286,229,1146,729,229,33198,39670,7673,729,229,7781,10141,729,229,8207,3585,1086,4834,3889,4140,764,904,904,729,229,37,9350,2322,2113,2881,3345,2113,2113,229,729,10,2675,5699,10,3187,2348,851,2691,1779,287,3307,4383,7596,940,84754,9511,271,229,221,6982,9511,3488,1567,229,1216,3307,21209,2485,330,2970,620,4281,3501,10378,6972,1729,554,1846,3211,773,229,29,6191,2616,940 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 904,393,553,645,826,555,7246,21312,645,826,1172,1146,1172,3219,780,3282,3656,535,623,645,3930,3210,3648,457,330,103,645,1143,3027,4740,229,386,645,1143,273,386,3210,4004,931,154,1143,21734,29,173,4004,21600,555,3027,1476,3224,3586,2029,570,2454,555,114,7894,3615,3235,645,67,457,330,33571,330,2029,3039,1141,2029,457,1131,2029,3553,457,881,1131,620,2720,773,1524,7366,645,1746,273,645,574,555,114,457,330,3039,1141,3648,457,330,330,330,1430,3050,273,2784,3050,330,3223,3224,2200,371,229,1632,554,295,2176,2292,386,386,229,645,567,2029,457,330,1131,1746,457,1131,1856,5787,645,2942,273,386,567,2029,3310,794,645,1676,273,393,2549,3282,3656,623,1746,645,273,1970,273,1784,560,3528,386,3027,3586,4401,273,295,671,386,163,1476,10093,904,393,553,3027,3216,386,567,535,623,20808,2889,2028,3780,1501,435,554,2366,555,5581,793,1131,457,881,457,1501,435,554,1476,1746,1131,457,33571,330,3050,273,2784,3050,330,3223,3224,2200,371,6031,229,1632,554,457,390,640,453,555,1002,6031,3027,2600,1381,67,330,330,6185,1430,330,1381,2896,373,10201,330,7643,2896,4507,373,330,2896,729,330,2896,2740,931,154,931,154,931,154,931,154,555,1131,403,330,1766,1832,2211,3050,1141,3223,3224,2200,273,1501,435,554,229,1632,554,36655,3282,3656,535,623,645,3930,560,2176,555,6122,645,2021,930,229,3576,229,3349,645,6031,1103,271,261,2312,1506,589,826,1089,394,11289,3270,2021,3471,645,826,555,555,7890,273,645,3586,4401,273,2292,386,3896,273,1420,9370,12770,8975,39757,27256,27146,273,85,21459,52934,19549,20175,1107,2161,20641,192,120642,8548,362,273,24019,9993,2272,13154,66236,1019,5680,52228,7231,2359,1269,52587,22328,15714,1951,554,9057,8601,13620,9080,8967,45,12676,18279,13049,6840,9076,8722,11611,6736,426,6596,6860,1019,566,8001,32729,22184,13267,2292,386,386,2292,386,273,1420,554,386,16687,8702,23432,32749,24613,19083,582,3173,11191,11673,54527,273,6688,16286,7957,29685,9249,52509,839,21373,9226,6272,91,11801,15691,7043,70524,749,565,8782,20716,192,2176,7456,5906,192,9014,9521,22659,39758,1726,3295,60047,9012,24259,5963,120643,20577,9049,2783,192,9082,88820,57422,15117,2161,13166,2292,386,2028,4225,457,273,2292,386,273,1420,52292,88810,548,8505,39753,3204,578,3421,4659,4736,86762,98,5713,121659,141,1029,2846,5230,5741,9053,39744,28039,121698,52511,39748,351,121652,16241,135043,21413,554,9776,6858,6556,6279,6717,6732,9013,141,17545,8950,12421,10770,6794,3067,2005,6719,23189,13188,8734,8111 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 904,3488,3307,3993,1752,459,3441,5003,461,10106,5206,229,4834,1042,3014,2863,287,452,229,1042,1970,2322,2934,2238,438,425,141,1172,1146,3158,2238,438,229,1146,2238,438,9561,508,2238,438,8207,3585,1086,4834,3889,4140,764,904,2238,37403,2881,3187,3648,851,229,10110,464,2936,2238,438,3441,2701,1214,2238,438,2322,2168,3648,5615,2316,229,1216,3246,1528,3241,902,1735,751,221,4990,221,3823,5711,2263,2891,229,1676,3698,3648,5206,3310,229,851,5163,371,2238,1676,221,2238,438,2881,2141,393,221,5561,904,1735,1651,1990,579,2220,1232,4023,1232,287,18085,35,3701,221,748,148,221,1232,4245,371,3553,2238,438,2322,10139,1843,10422,385,371,2238,40,4805,229,221,1407,2238,438,413,3118,3967,2322,567,3532,2238,1827,2899,1329,3192,2348,1990,14,2238,2322,1982,2691,425,141,1172,1146,3158,9076,229,1146,4087,2132,3086,36209,4087,375,39667,4087,9840,13261,1982,2691,3068,2310,1483,4834,3544,12447,3967,4087,4834,413,1329,2113,2880,4087,5062,12436,4087,4834,438,2348,706,7867,5291,904,1960,393,1472,141,1172,1146,10061,287,778,20362,76447,2880,22784,393,1960,3446,229,1222,1960,6188,693,10061,287,778,3441,3488,10324,3452,393,10407,5279,4266,452,3452,287,2900,827,15,7411,15,1196,3852,2176,2934,904,3488,3307,3993,1752,459,3441,5003,461,10106,5206,2113,425,141,3064,1172,1146,3158,2113,229,1146,2113,7927,2251,22784,2113,3187,3441,851,229,4807,3187,402,3112,229,3112,3471,452,9,10,2113,10172,3441,457,851,71,748,402,567,67,3263,3334,3524,2675,5566,40,2113,3779,221,904,30719,3647,2942,2113,3276,1367,3490,3269,603,3492,784,229,4402,3758,2113,5317,20904,2113,4910,3490,2974,3492,280,60374,29905,25435,2208,8071,26344,1843,8084,1597,4389,4007,2911,221,3461,12230,425,141,3064,1172,1146,3158,52495,229,1146,3461,12230,2272,2127,11916,764,2881,229,3461,12230,904,103,229,4834,3461,12230,904,229,3461,12230,3449,902,229,1399,554,533,1526,932,287,121723,2998,3561,15374,1399,2579,190,3445,2996,533,1526,3532,7709,1258,3030,3445,4162,533,1526,1597,2998,3512,902,5449,229,1399,554,3524,15374,3561,3461,1526,3475,4536,3461,5582,1014,729,229,425,141,3064,1172,1146,3158,8286,229,1146,729,229,33198,39670,7673,729,229,7781,10141,729,229,8207,3585,1086,4834,3889,4140,764,904,904,729,229,37,9350,2322,2113,2881,3345,2113,2113,229,729,10,2675,5699,10,3187,2348,851,2691,1779,287,3307,4383,7596,940,84754,9511,271,229,221,6982,9511,3488,1567,229,1216,3307,21209,2485,330,2970,620,4281,3501,10378,6972,1729 0 9329
+1146,371,2740,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 904,393,553,645,826,555,7246,21312,645,826,1172,1146,1172,3219,780,3282,3656,535,623,645,3930,3210,3648,457,330,103,645,1143,3027,4740,229,386,645,1143,273,386,3210,4004,931,154,1143,21734,29,173,4004,21600,555,3027,1476,3224,3586,2029,570,2454,555,114,7894,3615,3235,645,67,457,330,33571,330,2029,3039,1141,2029,457,1131,2029,3553,457,881,1131,620,2720,773,1524,7366,645,1746,273,645,574,555,114,457,330,3039,1141,3648,457,330,330,330,1430,3050,273,3780,1501,2366,555,5581,793,1131,457,881,1476,1746,1131,457,33571,330,3050,273,2784,3050,330,3223,3224,2200,371,6031,229,1632,554,2784,3050,330,3223,3224,2200,371,229,457,1501,1632,554,295,2176,2292,386,386,229,645,567,2029,457,330,1131,1746,457,1131,1856,5787,645,2942,273,386,567,2029,3310,794,645,1676,273,393,2549,3282,3656,623,1746,645,273,1970,273,1784,560,3528,386,3027,3586,4401,273,295,671,386,163,1476,10093,904,393,553,3027,3216,386,567,535,623,20808,2889,2028,457,390,640,453,555,1002,6031,3027,2600,1381,67,330,330,6185,1430,330,1381,2896,373,10201,330,7643,2896,4507,373,330,2896,729,330,2896,2740,931,154,931,154,931,154,931,154,555,1131,403,330,1766,1832,2211,3050,1141,3223,3224,2200,273,1501,229,1632,554,36655,3282,3656,535,623,645,3930,560,2176,555,6122,645,2021,930,229,3576,229,3349,645,6031,1103,271,261,2312,1506,589,826,1089,394,11289,3270,2021,3471,645,826,555,555,7890,273,645,3586,4401,273,2292,386,3896,273,1420,9370,12770,8975,39757,27256,27146,273,85,21459,52934,19549,20175,1107,2161,20641,192,120642,8548,362,273,24019,9993,2272,13154,66236,1019,5680,52228,7231,2359,1269,52587,22328,15714,1951,554,9057,8601,13620,9080,8967,45,12676,18279,13049,6840,9076,8722,11611,6736,426,6596,6860,1019,566,8001,32729,22184,13267,55002,386,386,2292,386,273,1420,554,386,16687,8702,23432,32749,24613,19083,582,3173,11191,11673,54527,273,6688,16286,7957,29685,9249,52509,839,21373,9226,6272,91,11801,15691,7043,70524,749,565,8782,20716,192,2176,7456,5906,192,9014,9521,22659,39758,1726,3295,60047,9012,24259,5963,120643,20577,9049,2783,192,9082,88820,57422,15117,2161,13166,2292,386,2028,4225,457,273,2292,386,273,1420,52292,88810,548,8505,39753,3204,578,3421,4659,4736,86762,98,5713,121659,141,1029,2846,5230,5741,9053,39744,28039,121698,52511,39748,351,121652,16241,135043,21413,554,9776,6858,6556,6279,6717,6732,9013,141,17545,8950,12421,10770,6794,3067,2005,6719,23189,13188,8734,8111,9297,9174,12710,18667,2292,386 0 9329
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 271,319,1412,5699,2185,5699,2185,3620,1620,4218,5041,1412,3204,5699,4758,13916,6483,11580,600,600,1970,1620,600,5699,31698,1620,3291,939,5699,2185,8092,5699,4758,1620,5699,600,1812,5426,2292,1620,600,1812,5699,2292,3291,939,2279,966,600,1812,295,2176,3294,966,297,2672,966,297,2672,2927,600,414,2996,1832,4589,31698,297,2672,2029,600,6653,3307,14673,67,3614,31698,889,295,2176,1798,297,2672,600,1812,2292,1812,5236,13720,1620,31986,1812,1970,13720,1620,31986,1812,3620,7412,8937,1812,13720,2292,1812,13720,107,1730,2560,1072,156,414,827,8937,1812,600,1812,297,2672,2292,1812,8937,1812,871,1325,2292,10624,1200,7799,166,1857,1077,1077,1731,4192,966,297,2672,2927,600,414,297,2672,1039,294,3558,600,2975,871,1325,1325,2982,2888,5457,871,4254,1812,475,1072,156,871,1325,889,1970,1620,2030,5699,1200,1161,3328,6922,871,1325,3540,438,46,3868,3637,1077,80,3834,1077,80,4218,8941,764,414,4638,3024,1077,297,600,2292,1812,24885,1812,871,1325,2292,10624,1200,7799,600,13720,1812,10624,3909,67,67,3909,435,966,297,2672,10624,1812,671,67,1832,3014,600,414,13720,2292,1812,4402,101,570,297,2672,295,2176,3294,1857,10624,2292,10624,1200,7799,166,3049,10624,3049,10624,21681,1755,13860,2707,1643,166,1755,2568,15680,2413,1200,7799,475,3445,533,6715,2560,562,156,319,827,7799,798,4055,5295,4055,943,600,13720,67,671,3245,600,1812,10624,1857,3118,600,13720,1857,10624,3117,600,13720,1812,589,6974,17458,671,2292,600,966,1812,10624,1857,101,295,2176,3294,3158,4302,229,1560,4302,11847,81937,2817,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 136,52,46,490,613,52,397,346,2794,103,397,397,3550,2373,50,2098,2099,2098,6983,13661,600,584,3352,14562,2420,11862,24519,113,600,183,13827,166,600,24740,5758,600,183,987,11093,31009,27255,600,27284,2484,600,2483,987,600,57111,13680,600,183,2484,11093,1696,2484,13679,600,2483,2484,13768,600,2834,2484,13679,35106,600,997,2484,13679,35106,600,35021,2484,13679,35106,600,35040,2484,13679,600,943,2484,11093,13975,2484,3295,600,943,2484,20706,600,816,14158,816,1882,600,35097,166,600,35097,7595,600,14158,9998,600,35097,166,600,2413,70,13853,2413,2420,3091,2413,600,14153,798,600,13847,600,118799,600,70,11093,5392,70,600,2184,70,600,13850,50,15680,8345,3295,600,13853,5398,1870,600,4780,603,600,702,2420,259,320,600,15063,7595,600,15063,578,1812,3295,600,5111,2273,600,14122,8345,9995,9990,600,9437,9995,1229,600,172672,9995,9990,600,15093,600,85818,600,5295,4055,1696,8623,600,31009,12622,8623,600,31009,4288,600,15818,8623,600,27227,11093,600,27228,11093,600,14408,15133,600,427,600,424,4288,600,6505,4288,8623,600,2834,600,2483,600,997,8623,600,31657,8623,600,2280,8623,600,35021,11093,600,35040,4288,600,13852,11093,600,14496,11093,600,27298,11093,600,1445,14612,12334,600,2514,1445,600,55530,600,13848,600,2060,600,943,4055,13849,11093,21370,600,26636,9995,18186,600,33342,600,934,3666,2470,1111,2211,5779,44354,136,2814,69639,2373,50,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2744,1043,377,2744,1043,377,187,117961,491,1043,377,2952,1048,271,187,117961,491,1043,377,3014,1043,2176,2968,377,1330,187,117961,491,1043,377,491,490,1043,2176,3930,24824,8807,21379,2744,1938,2814,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 319,392,397,8284,459,7103,3881,1111,397,101,452,764,3281,1335,5593,2896,4549,9431,6424,2296,2176,101,452,934,852,2794,5896,1014,343,4636,514,1887,3914,7924,35603,13263,6074,4998,67,1990,295,2862,773,10317,3536,2470,1641,3189,2046,2922,6140,3189,3351,6140,3189,2046,2922,6140,3189,2046,2922,6140,3189,2046,2922,6140,3189,2046,2922,6140,3189,2046,2922,6140,3189,2046,2922,6140,3189,2046,2922,6140,397,101,452,764,3281,1335,5593,2896,4549,377,81,2211,4998,67,1990,2228,5568,464,2794,3158,18548,3128,2814,2436,60922,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 827,9106,11289,1111,20821,600,4459,6140,1335,3128,4636,397,452,7103,3881,1111,397,101,452,764,3281,1335,5593,2896,4549,9431,6424,2296,2176,1335,5593,934,1335,1335,1524,3039,1335,1887,1180,1582,4664,14529,2769,6820,6512,3734,2769,5593,2470,1335,5593,1335,827,9106,11289,1111,20821,600,4459,6049,2578,6140,2310,271,827,9106,11289,1111,4032,1188,259,392,986,7283,163,4610,1733,4779,3614,600,1832,4459,5236,4636,397,452,48471,4039,135724,1216,2929,1079,392,397,355,2447,4050,4498,107,271,7283,3614,3937,2440,3076,397,2155,1748,535,2917,2181,602,2699,604,1748,392,397,14673,6656,4529,7012,64265,1188,5525,2219,413,7283,26824,6979,2185,1014,4536,535,1798,1143,600,4459,793,1014,13929,3026,2395,80836,4536,535,8205,14301,4303,403,2394,13072,151962,357,3676,434,2997,12406,271,3988,6530,403,1908,1720,2394,6340,397,2462,6340,1074,2292,600,4459,5254,7283,6385,1162,3942,11289,1803,3742,26813,8337,9433,9433,1162,3942,11289,3639,5829,8337,809,85751,1143,600,2996,4459,6250,5518,5829,8337,809,793,1014,570,966,600,764,4459,103,6971,107,135724,5229,2558,2699,2488,604,8659,112,2012,1423,3295,6971,271,3135,147,2012,3684,2853,18548,393,4636,3187,329,397,1216,938,397,101,452,764,3281,1335,5593,2896,4549,377,81,2211,4998,67,1990,2228,5568,464,2794,3158,18548,3128,2814,3212,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 343,136,4031,2982,533,223,3233,2982,533,223,5699,5295,943,259,9239,1240,5295,943,2982,533,2982,533,223,4402,71,392,3540,1240,5699,5295,943,763,533,2316,726,5343,3326,1240,2945,5699,1200,1161,259,2863,9,10,393,4636,3128,393,533,1079,452,7995,4402,1240,5699,183,5699,943,2292,5699,3558,2996,600,2975,490,3261,2701,6248,1240,5295,943,2522,2560,136,1072,156,8628,115,562,156,1409,1367,2254,259,3279,4638,5328,37,5295,943,1240,2982,1161,183,943,601,3637,505,147,5917,2149,505,3561,147,1330,5343,1161,4402,5699,5295,943,1901,3540,505,3544,1329,1423,1958,3176,2998,147,4402,5699,1958,2037,2998,5917,5699,3540,2927,2049,1846,5295,943,414,3814,533,5078,13710,2942,1161,4402,259,1734,6298,113,5295,943,297,319,648,181,4402,5699,5295,943,6031,3128,319,648,181,3246,4402,5699,183,5699,943,2292,5699,1143,589,2149,505,8808,147,637,3128,1676,181,2149,505,3543,505,1423,413,3544,1329,1240,5699,943,5699,183,2292,1330,901,2316,5343,1240,764,4607,604,1240,5295,943,4607,604,8659,2996,1803,827,600,319,578,600,5295,943,3686,14011,578,600,827,7799,5295,943,1111,163,764,759,600,319,8659,764,3305,2560,562,156,846,4529,3234,1240,5295,943,223,3628,2842,1240,5295,943,3043,2699,8289,793,1014,271,101,3814,6092,3542,19361,620,3752,3581,14662,3128,4802,15,2023,648,2970,4143,2046,223,18604,2817,33,19361,1754,2270,2982,533,1362,809,533,2634,1160,1043,377,343,136,4031,2896,377,19361,269,2814,21585,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 343,136,4031,2982,533,223,3233,3734,3304,7310,3304,1497,44957,19361,3734,2322,343,4357,1240,6264,3416,5295,943,13821,5699,5295,943,763,1335,259,5343,1240,5295,943,3311,1901,2982,533,259,7840,1240,297,5699,1240,6264,3416,343,136,4031,19361,3934,4357,2589,2400,1240,5699,5295,943,20793,2168,1367,1240,1827,5699,5295,943,2982,533,2316,6072,3828,392,1367,539,104,259,722,3540,5699,6423,104796,4486,3129,2141,223,19361,1200,1161,259,3304,1047,393,4636,3128,393,533,1079,452,505,1423,413,3544,1240,5699,5295,943,763,533,505,1423,3544,2998,147,726,1240,2998,1958,2037,5917,1240,3540,1240,5699,5295,943,424,295,3128,2863,319,648,181,181,4402,1240,5699,5295,5699,943,2292,297,5699,3128,2863,3553,181,2149,505,3543,505,1423,413,3544,1240,5699,943,5699,183,2292,5699,5295,943,329,3550,3261,2701,3760,1240,15787,5295,943,2522,2560,1072,156,8628,113,136,115,156,1240,5295,943,3674,6974,8289,2029,11282,1950,2162,533,2959,966,259,5343,505,1240,15787,5295,943,756,2121,997,4187,2839,2126,579,4639,1077,80,7799,3765,2049,156,4032,32548,175,5295,943,797,415,533,1877,764,3768,4607,604,1877,1240,5295,943,14011,578,600,827,7799,711,1240,5295,943,6477,3458,793,1014,413,3234,8289,420,604,52,966,5343,8659,1188,4402,8659,259,1240,319,52,602,604,1803,1039,600,319,5295,943,827,711,7799,3870,5295,943,1111,1694,3636,600,1424,6519,1240,5295,943,15,1423,505,7302,5917,1423,1329,478,259,294,622,294,5802,46,478,259,5955,2400,966,3760,1240,5295,943,5955,8865,5295,943,3597,809,414,4254,156,19361,2973,343,6697,3882,478,259,5917,1423,1329,1240,1367,2316,764,7538,4610,297,5699,5295,35067,5699,456,764,727,5699,11093,2768,943,183,11093,4288,183,11093,966,2484,11093,13861,35009,25315,1391,13861,6249,1746,5699,943,12622,13680,4288,13679,2484,5295,943,581,4638,11862,966,2484,13663,15818,4819,5051,13661,13861,744,13849,177,1696,15820,13860,2768,35067,13975,14066,5370,357,4610,5699,3553,1641,13763,1476,1043,377,3158,2814,271,101,3814,6092,3542,19361,620,3752,3581,14662,3128,4802,15,2023,648,2970,4143,2046,223,18604,2817,33,19361,1754,2270,2982,533,1362,809,533,2634,1160,1043,377,343,136,4031,2896,377,19361,269,2814,26329,21585,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 5295,943,3234,533,5917,5295,943,3234,533,5142,1641,1749,827,2211,934,5295,943,1077,80,7799,693,2975,5427,10020,3765,156,4032,32548,2273,4195,175,3135,3581,763,533,5295,943,797,415,13710,9498,6214,1409,32548,5239,5268,3809,4589,6298,5295,943,756,2121,997,4187,2839,2126,579,1284,2049,7034,156,4032,32548,175,1077,80,3581,533,357,32548,1755,2909,5295,943,31318,4187,2121,997,5295,943,13975,2597,2184,13849,78037,13975,2927,319,13975,14066,13975,14456,78038,122527,35009,25315,35019,39736,14187,105963,1943,14308,5295,943,27228,427,14496,5295,943,604,929,2316,5295,943,578,600,1812,1284,3094,711,7799,2254,6264,759,4628,2699,2998,8289,1240,5295,943,1111,693,3529,2982,1111,4539,1761,3562,3014,1240,2944,3623,943,827,600,319,6161,475,2522,600,8865,1730,13631,764,4539,759,600,6359,2944,3623,319,943,6161,1240,5295,943,4081,3043,578,1812,414,475,604,203,604,3929,5295,943,156,1072,156,827,487,828,9314,136,115,570,2310,18333,1436,9,10,414,2749,5295,943,578,1812,475,2522,2560,156,136,764,414,2749,5295,943,294,2560,136,1003,865,38717,23316,12603,2619,31112,3898,136,87,18,13296,389,827,487,828,2681,107,1200,3515,2369,8628,1755,764,827,487,828,8079,5699,5295,943,294,487,828,1795,9314,2681,107,3204,1240,5699,5295,943,475,3494,294,2560,9314,107,5979,8079,1827,5699,9314,809,5323,3553,5699,1072,156,764,1240,2316,5295,943,5699,3494,294,809,1072,156,764,1240,5699,397,3328,764,10007,2992,1072,156,1309,6885,1240,414,2749,5295,943,115,1188,414,3751,2560,2665,2992,113,115,3234,7385,2699,604,5078,793,1014,1240,2699,414,297,5699,5295,943,3546,1111,216,113,115,52,677,475,115,4539,1761,1240,5295,943,1111,2722,6160,8854,3326,1240,5295,943,1734,1402,604,369,2176,377,81,5779,934,19361,934,2814,459,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 579,1643,579,1643,14612,2795,535,35036,1072,2699,1643,13808,14612,943,2795,8623,15206,14215,31012,2336,35100,11093,795,473,579,1643,11093,2252,711,13789,5457,11093,12622,13680,5392,13851,13849,25119,8381,8623,2695,2396,2795,35086,15206,2336,1643,1746,2252,711,5457,3823,759,710,4482,31756,3885,17905,3549,1746,943,4482,2768,3553,3885,4555,2254,1643,759,3567,4482,3567,2396,2391,3885,5699,3639,5699,5699,2185,11093,5699,8381,943,600,2292,1812,8937,1812,871,6922,1325,6922,1731,6922,4192,6922,3158,19344,269,2814,533,287,1072,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 414,473,101,414,473,101,943,5295,473,101,943,5295,1149,1481,3079,414,3646,11934,1077,80,3049,10624,21681,1200,7799,4195,3234,763,533,3588,578,1812,3558,5567,1746,695,2316,259,1423,1240,4402,1143,5699,473,101,943,5295,601,319,475,5184,294,2560,562,156,113,136,2316,600,414,3096,473,101,943,5295,473,101,827,3049,10624,2707,8344,13860,1643,1755,2927,319,648,181,943,2184,5392,4288,798,24414,2551,635,1882,798,1304,798,1424,181,581,5699,943,1304,691,321,319,7799,7799,1755,321,319,473,2707,8344,798,13851,943,5295,4589,113,7799,319,1734,319,297,1240,1734,7799,1284,321,319,3234,3265,2723,3452,2522,206,562,30910,45551,156,38768,294,2560,1072,156,136,533,1877,475,827,7799,414,3096,6076,3083,319,7799,2781,7799,2440,1856,319,415,321,319,1734,1077,80,4639,533,2316,5295,943,14011,578,1812,4639,13710,319,6076,3234,533,319,5933,867,1077,1077,31318,560,1077,3224,20014,3224,31239,13710,1755,321,319,1524,1077,31318,1077,1524,80,7146,1761,1581,2393,287,5564,5393,935,2522,2560,136,562,156,2393,3768,3614,4195,321,319,3581,136,20014,3471,1635,314,1077,3452,2522,2560,3015,113,2358,10384,3224,80,14729,1755,1908,1734,943,5295,1731,1755,943,1111,2522,2560,827,487,828,3224,2968,12622,5295,943,3637,96,4851,705,13680,13679,5295,943,3237,21430,5218,31751,319,1199,392,1037,1412,1111,319,2749,10624,7799,13710,578,1812,1325,5615,3742,1240,473,101,2707,8344,13860,1643,943,5295,1240,4288,798,31748,13851,1730,7799,8865,1240,1734,473,473,101,4288,798,7799,2749,943,5295,13849,5392,13851,2280,11632,3224,1043,533,2814,66860,473,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3849,943,7753,3849,943,7753,13725,2522,5457,5042,35110,11093,1695,943,3076,20701,31041,13849,15206,31034,26636,13975,31040,16678,47724,1812,35110,1746,943,4482,2626,2768,827,3885,17905,4022,163,5699,1042,13763,13763,2911,6041,133113,4878,2699,13763,1159,13710,3606,5699,600,871,6922,7799,1325,6922,966,600,1812,32337,19361,269,2814,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 181,5699,8865,505,5343,181,5699,8865,505,5343,35609,94242,3348,693,2176,11796,2176,94243,695,1264,3304,834,3215,3158,35609,3128,2814,94242,94243,55060,2768,2241,1524,4221,1228,392,397,1424,26705,1079,392,397,355,4636,397,452,393,4636,8588,14537,10453,2769,35609,1129,26705,755,6140,2176,7869,764,4889,2974,4561,935,703,695,2657,26528,2141,26705,1079,392,397,355,94242,4636,397,452,18548,3128,9967,5746,2936,2141,392,4536,94242,397,4484,1228,392,397,1424,18548,3128,1214,1228,392,397,1424,94242,18548,3128,16186,17458,8590,6051,45083,31691,89715,94244,6290,1214,2936,6311,281,6028,2013,319,858,397,1424,94242,18548,3128,2822,60861,5726,343,136,4031,343,4031,533,49991,9812,2447,81228,38285,6057,81231,355,392,3522,5788,3128,1214,319,858,397,1424,94242,18548,3128,1987,60939,660,6380,3135,4484,782,9752,17458,8590,1809,31691,3216,760,3623,3666,773,181,5699,3304,319,858,397,1424,94242,18548,3128,535,773,2176,181,5699,8865,3440,181,3224,773,2725,319,8865,3261,858,319,8865,2996,60938,5699,3540,393,4636,319,648,181,3930,3666,773,181,5699,8865,3128,18548,2029,181,5699,3540,3553,660,60938,3030,773,5366,3496,592,5699,3540,1409,1423,1720,3128,49991,271,5699,3540,2149,505,1329,1330,3128,59401,2447,2287,4628,3030,60938,60938,5962,695,2030,5832,1423,1424,505,1329,1330,4628,1424,505,1329,1330,5962,695,2996,1329,1330,3516,5832,1423,1424,5899,773,1846,4288,798,13851,1304,1304,6215,1424,943,1424,3538,319,648,181,181,3224,3896,438,648,3897,1111,259,31751,414,3609,1200,1161,259,3128,49991,3128,181,3847,67,319,5207,4402,1143,5699,2899,100,1424,473,943,183,592,1304,5615,1812,611,1746,166,414,181,4838,2996,1329,1423,4838,3586,1240,1827,5955,1143,5699,4402,1720,592,1424,2996,1329,1329,2310,5699,413,592,5699,2065,15571,147,1143,592,5699,1668,2065,147,764,5041,600,1240,5699,3588,4763,814,1969,4402,1720,5699,1790,2149,505,1329,8808,147,1330,5343,6185,1790,2316,505,1151,3176,2998,147,8808,5917,938,1720,1790,1151,2037,2998,5917,2998,147,2149,505,1329,1330,456,5699,2185,3531,2185,2176,3906,2176,5699,8865,660,2927,413,66874,285,319,8865,3557,535,1012,365,870,2996,1329,1423,3128,3261,858,319,8865,2996,60938,3553,505,1329,1423,60938,60938,3013,3189,3189,3128,18548,60938,3013,3308,4016,3128,18548,1256,2185,3018,2927,2911,3538,438,1256,2185,5832,1423,1424,2911,6332,889,18337,3237,6522,8322,3018,6522,5564,21324,456,1256,2185,1391,13077,4836,1026,3538,6092,535,1026,3018,60938,3839,1837,809,966,3128,18548,5969,67,870,535,2992,181 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 5295,943,3234,533,4740,2176,5295,943,3234,533,5295,943,1077,80,7799,693,2975,5427,10020,3765,156,4032,32548,2273,4195,175,3135,3581,763,533,5295,943,797,415,13710,9498,6214,1409,32548,5239,5268,3809,4589,6298,5295,943,756,2121,997,4187,2839,2126,579,1284,2049,7034,156,4032,32548,175,1077,80,3581,533,357,32548,1755,2909,5295,943,31318,4187,2121,997,5295,943,13975,2597,2184,13849,78037,13975,2927,319,13975,14066,13975,14456,78038,122527,35009,25315,35019,39736,14187,105963,1943,14308,5295,943,27228,427,14496,5295,943,604,929,2316,5295,943,578,600,1812,1284,3094,711,7799,2254,6264,759,4628,2699,2998,8289,1240,5295,943,1111,693,3529,2982,1111,4539,1761,3562,3014,1240,2944,3623,943,827,600,319,6161,475,2522,600,8865,1730,13631,764,4539,759,600,6359,2944,3623,319,943,6161,1240,5295,943,4081,3043,578,1812,414,475,604,203,604,3929,5295,943,156,1072,156,827,487,828,9314,136,115,570,2310,18333,1436,9,10,414,2749,5295,943,578,1812,475,2522,2560,156,136,764,414,2749,5295,943,294,2560,136,1003,865,38717,23316,12603,2619,31112,3898,136,87,18,13296,389,827,487,828,2681,107,1200,3515,2369,8628,1755,764,827,487,828,8079,5699,5295,943,294,487,828,1795,9314,2681,107,3204,1240,5699,5295,943,475,3494,294,2560,9314,107,5979,8079,1827,5699,9314,809,5323,3553,5699,1072,156,764,1240,2316,5295,943,5699,3494,294,809,1072,156,764,1240,5699,397,3328,764,10007,2992,1072,156,1309,6885,1240,414,2749,5295,943,115,1188,414,3751,2560,2665,2992,113,115,3234,7385,2699,604,5078,793,1014,1240,2699,414,297,5699,5295,943,3546,1111,216,113,115,52,677,475,115,4539,1761,1240,5295,943,1111,2722,6160,8854,3326,1240,5295,943,1734,1402,604,2814,459,3212,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 578,600,294,1812,691,319,578,600,691,271,1159,1330,5198,846,319,5207,2865,3562,1077,80,319,2316,600,166,1812,2254,1077,80,648,6981,8197,1970,447,4146,1412,1826,600,1409,101,4598,3559,1039,1812,319,294,1812,319,592,101,13944,1599,13944,1812,780,47724,2522,1812,1599,1599,578,1812,2522,1812,1812,780,47724,1599,2630,7595,67066,60846,578,1812,1812,780,13680,2807,2630,14934,7595,16250,27280,7595,2967,1812,780,47724,1599,24099,7595,9998,578,1812,2807,7595,702,66966,944,7595,702,1812,780,7595,702,702,35071,5111,7943,2522,600,702,578,600,320,702,1812,780,702,259,702,1812,780,259,702,113,1812,780,702,603,15063,702,578,1812,2522,1812,15063,702,1599,1215,702,3043,47724,1599,578,5872,1215,702,1599,56777,702,3043,47724,1599,56777,702,816,7595,66965,49715,13700,14156,578,1812,2522,1812,1599,1668,1812,4288,1599,14156,8344,473,13860,85815,35586,1643,35586,35016,14411,13860,579,14066,65380,13860,4187,14066,49226,13860,702,14066,13860,943,85813,14607,31184,13859,15120,1643,2768,66870,27270,2522,1812,14607,1304,1594,5040,744,1304,43068,43070,85814,578,1812,1812,780,744,1304,578,1812,30971,1304,2252,521,603,294,1812,2252,521,25796,14036,1617,25796,5529,14065,603,3063,1785,6160,5529,3063,1785,3063,3063,178,1199,1412,5042,178,576,4559,14206,5042,178,576,579,1304,2795,10020,5418,711,10020,5418,13692,2522,1325,3870,1785,6021,14216,85816,1785,67014,12068,4017,1812,3516,2526,67015,66846,67014,2526,67069,12068,5529,2320,14065,13680,35164,1594,2694,1594,14609,1729,1594,14435,85817,12622,13680,13679,711,1992,1992,6531,1992,6359,13680,4675,5370,1284,13720,1812,5699,13680,4675,5370,1284,13720,1812,5699,294,1325,82415,14036,178,14036,13809,1199,1412,30993,14036,2967,57122,13693,7280,57050,85819,3091,1144,5528,6032,1540,2881,5528,35971,2597,5528,26685,56980,39234,6390,26685,35063,2522,1812,1812,780,26685,56980,2188,14122,578,1812,14122,294,1325,85818,2568,14122,294,1325,13869,8854,14658,2121,13869,5838,319,579,34286,3887,2522,1812,1812,780,3887,9437,14122,24740,2782,6505,1661,2725,600,889,13661,31007,1445,13850,50,15680,944,733,5295,943,2630,7595,1524,11677,1661,13680,2807,13680,183,14658,14603,1661,14064,14603,2967,1599,14603,2967,47724,1599,1812,14155,13861,14177,603,35111,8345,944,718,35111,414,35111,27280,8345,13941,15710,13768,603,14608,944,414,14608,27327,603,13861,14177,2522,600,1812,780,13861,14177,1995,2484,9998,2576,13827,315,19151,8345,35111,14743,2707,14153,6614,4904,2707,14743,14155,9503,30926,59375,1768,2820,4907,2694,68770,2874,6359,2795,8345,535,35107,35040,11443,13693,7280,10169,13679,7595,7753,13679,35110,2927 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 6671,259,14059,600,535,1555,1970,2254,5207,394,58251,1812,5521,1812,1555,13663,14154,2707,1888,1695,21681,14153,603,35097,183,8344,25088,14154,11093,2707,21681,1599,11093,1599,997,2484,11093,183,816,603,11093,780,1599,13725,1599,13663,2292,744,14213,1785,14413,14154,2707,1888,1695,2707,21681,5529,14213,1785,85820,13725,5529,1857,259,702,578,1812,578,1325,1695,13725,1857,14187,13295,13975,1888,1695,943,14608,578,600,35097,1812,1696,1888,183,711,11093,780,744,2292,5370,13966,13725,14745,5529,1857,943,2795,35097,1812,13693,2184,1888,2707,21681,35111,35097,1812,756,798,96,35111,11093,943,1812,13849,96,35111,11093,943,1812,579,5370,5195,1888,2707,21681,2630,1599,11093,2707,21681,1812,2630,14158,35106,11093,780,711,11093,780,5370,2292,13661,13850,11093,2707,21681,35111,35097,1812,2292,600,21300,58251,2292,19456,58251,871,6922,2292,1812,58251,1857,58251,1325,6922,3216,600,66172,4727,13710,26121,1524,4192,14724,2092,4040,8325,394,5937,2959,600,600,3624,600,8854,43082,31698,8865,3018,1720,600,600,414,3639,674,600,8854,604,203,4607,8853,1795,4607,600,9061,2292,1620,604,1031,604,3929,3445,1730,1143,3885,1014,297,1574,26658,215,52,604,1256,159,2181,287,1960,1748,1960,19344,934,2699,604,934,66952,934,3027,3570,5796,3536,253,535,3227,4171,2176,2211,19344,3216,3867,7093,5327,2980,4303,3027,773,986,3158,19344,269,2814,533,287,1072,1188,4607,23189,26569,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 4526,2699,319,5207,13763,3852,1143,26660,118955,312,14743,14154,2707,163,4843,35031,26660,14743,5280,2036,7882,5699,2036,15,1423,5699,35111,8345,15697,35097,35097,2707,1695,473,26660,35097,35097,166,35097,35095,6168,718,13789,35111,8345,1695,2707,3281,2707,1695,3887,1387,5210,26660,166,10011,938,1695,2707,3281,2707,35120,3787,1540,1402,2945,14743,4459,2881,4909,87868,6076,388,7882,1695,2707,2707,6215,15,1423,1695,2707,2707,6215,11093,183,943,600,5699,7882,15,1423,1857,966,10624,966,1812,966,87213,56980,26660,118955,312,121949,175558,27270,31004,5051,53973,14496,4698,14066,377,602,35169,3027,3570,3536,26726,45,2814,3158,26726,45,2814,35169,22261,1335,118955,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 4526,2699,319,5207,13763,3852,1143,121949,175558,27270,7487,4780,14216,6501,13663,5280,2036,7882,5699,2036,15,1423,5699,1599,578,1812,11093,11093,5195,5724,603,11093,11093,13852,11093,11093,1696,14717,14215,11093,11093,1540,166,10020,11093,11093,26660,35097,35097,6168,4628,1599,5195,5724,13852,1696,1540,166,4644,14721,3823,27270,710,2522,2396,31756,4555,17905,3885,5210,26660,11442,27270,8344,15339,2881,4909,87868,6076,388,7882,35095,11093,2707,2707,6215,15,1423,11093,11093,2707,2707,6215,11093,183,943,600,5699,7882,15,1423,1857,966,10624,966,1812,966,87213,56980,26660,118955,312,121949,175558,27270,31004,5051,53973,14496,4698,14066,253,3536,3027,2211,26726,45,2814,3158,26726,45,2814,35169,22261,1335,27270,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 4526,2699,319,5207,13763,3852,114,1143,23624,13975,34741,34741,1746,4589,13827,13703,1304,1594,14609,29980,70,5280,2036,7882,5699,2036,15,1423,5699,13975,25732,9061,9061,23624,13725,15206,4187,35100,35097,35095,1995,2484,12622,35097,35095,31754,35100,35097,35095,25119,68771,1082,14188,5457,35097,35097,6168,1082,14188,13975,14717,14215,23624,5210,5280,4482,13675,1435,5699,104,87868,6076,388,11051,7882,11093,11093,183,943,15,1423,35095,35095,183,943,600,5699,7882,15,1423,1857,966,10624,966,1812,966,25677,178,52944,1882,798,7753,13860,23624,13975,34741,7714,13693,6974,1643,1852,42477,253,3536,3027,2211,26726,45,2814,3158,26726,45,2814,35169,22261,1335,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 4526,2699,319,5207,13763,3852,114,1143,25677,178,52944,178,52944,1284,3094,5230,7482,1734,943,5168,3063,178,5280,2036,7882,5699,2036,15,1423,5699,2336,31012,35100,26636,15161,14215,11093,11093,32427,4398,1695,11093,11093,25119,4187,15161,14188,16678,14215,13725,9061,2707,27366,35095,11093,178,3063,9061,9061,31753,35100,35095,11093,1992,8133,11091,5457,35097,35097,31037,10054,10054,6168,9473,4628,5280,5210,13771,9995,733,1770,2598,1250,4526,178,6679,197,4482,15158,4703,2768,966,4064,827,3885,12392,3885,2768,1695,5699,2881,4909,87868,6076,388,7882,1695,13725,1304,1304,6215,11093,183,943,15,1423,1695,13725,1304,1304,6215,35095,183,943,600,5699,7882,15,1423,1857,966,10624,966,1812,966,25677,178,52944,1882,798,7753,13860,23624,13975,34741,7714,13693,6974,1643,1852,42477,253,3536,3027,2211,26726,45,2814,3158,26726,45,2814,35169,22261,1335,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 4526,2699,319,5207,13763,3852,114,1143,1852,42477,42477,113,15818,2768,6715,60862,13827,756,60862,3567,2121,42477,2597,5280,2036,7882,5699,2036,15,1423,5699,42477,16563,9061,9061,6168,3281,29608,8441,1391,14721,1284,9995,2252,711,14717,42477,4180,94866,9995,7726,3281,7726,8441,2695,4482,2695,1852,10404,2881,4172,87868,6076,388,7882,11093,11093,183,943,15,1423,35095,35095,183,943,600,5699,7882,15,1423,1857,966,10624,966,1812,966,25677,178,52944,1882,798,7753,13860,23624,13975,34741,7714,13693,6974,1643,1852,42477,253,3536,3027,2211,26726,45,2814,3158,26726,45,2814,35169,22261,1335,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 414,473,101,414,473,101,943,5295,473,101,943,5295,1149,1481,3079,414,3646,11934,1077,80,3049,10624,21681,1200,7799,4195,3234,763,533,3588,578,1812,3558,5567,1746,695,2316,259,1423,1240,4402,1143,5699,473,101,943,5295,601,319,475,5184,294,2560,562,156,113,136,2316,600,414,3096,473,101,943,5295,473,101,827,3049,10624,2707,8344,13860,1643,1755,2927,319,648,181,943,2184,5392,4288,798,24414,2551,635,1882,798,1304,798,1424,181,581,5699,943,1304,691,321,319,7799,7799,1755,321,319,473,2707,8344,798,13851,943,5295,4589,113,7799,319,1734,319,297,1240,1734,7799,1284,321,319,3234,3265,2723,3452,2522,206,562,30910,45551,156,38768,294,2560,1072,156,136,533,1877,475,827,7799,414,3096,6076,3083,319,7799,2781,7799,2440,1856,319,415,321,319,1734,1077,80,4639,533,2316,5295,943,14011,578,1812,4639,13710,319,6076,3234,533,319,5933,867,1077,1077,31318,560,1077,3224,20014,3224,31239,13710,1755,321,319,1524,1077,31318,1077,1524,80,7146,1761,1581,2393,287,5564,5393,935,2522,2560,136,562,156,2393,3768,3614,4195,321,319,3581,136,20014,3471,1635,314,1077,3452,2522,2560,3015,113,2358,10384,3224,80,14729,1755,1908,1734,943,5295,1731,1755,943,1111,2522,2560,827,487,828,3224,2968,12622,5295,943,3637,96,4851,705,13680,13679,5295,943,3237,21430,5218,31751,319,1199,392,1037,1412,1111,319,2749,10624,7799,13710,578,1812,1325,5615,3742,1240,473,101,2707,8344,13860,1643,943,5295,1240,4288,798,31748,13851,1730,7799,8865,1240,1734,473,473,101,4288,798,7799,2749,943,5295,13849,5392,13851,2280,11632,3224,3158,12907,3128,2814,13761,105014,473,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 600,600,1812,2501,3158,13708,3128,2814,78008,21475,229,319,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 600,600,1812,600,600,1812,2292,600,600,1812,1970,3540,3608,600,1812,3666,2501,2501,295,2501,3841,2688,3954,3158,13708,3128,2814,78008,21475,229,319,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1880,501,1881,414,600,8899,11796,501,1881,1881,1388,11643,9789,4074,11058,1146,13535,8949,31466,12676,7375,3371,8255,41957,3102,6781,41958,1524,18547,37201,16490,11642,8783,11342,6483,10900,9353,6588,42135,6799,6922,9800,9082,5963,41959,11554,12421,10770,3060,41960,2005,41961,414,600,3906,2176,7862,691,330,2109,3452,319,867,574,575,3540,7862,600,1812,5699,217,580,1812,580,691,330,1623,938,600,414,2109,1623,938,394,1674,319,6354,3967,600,4010,600,1620,394,567,2589,26,13720,711,768,52912,600,434,535,6474,3195,394,3870,319,3326,176574,557,600,1620,394,567,2589,23907,711,8854,768,52912,4589,319,535,693,2270,4589,1620,394,456,4533,14658,3765,600,8104,2185,4533,14187,600,434,394,414,5334,1622,4589,113,600,1812,600,1620,394,1857,600,2109,1832,31698,3620,535,1734,17458,27670,1423,8293,103,604,3549,604,8293,3280,570,3452,1623,938,1620,600,414,3756,394,414,693,8010,414,3276,5078,1620,600,2994,3611,1620,13710,693,7594,319,15587,3304,394,1674,394,4888,3452,6340,4235,202,567,535,692,693,12781,394,560,1812,580,2408,535,320,319,535,394,3471,10452,1730,1014,3030,1730,10452,693,2975,692,6518,6297,6715,1014,693,3261,1674,394,1812,580,535,604,1653,3030,1730,8865,319,6715,1014,392,1412,319,4706,3586,1620,600,3247,319,319,867,1623,938,14011,4589,319,4589,1620,600,319,2630,7595,600,35009,943,574,575,1623,938,7384,414,17873,414,3108,24531,604,1653,4263,693,1180,3108,30911,44578,60005,414,1975,578,600,3537,10087,3030,31751,604,203,10275,870,604,5009,3046,600,3628,3775,215,505,2149,5343,1407,600,4402,297,874,567,1620,600,202,2951,2982,1240,2634,3337,2206,7145,31698,6715,567,353,2149,5343,3882,10275,604,3540,1623,938,8010,414,3540,3113,600,1240,1304,1594,5040,4402,4187,320,1304,67068,2722,2694,319,319,14306,1812,1768,14155,1730,1200,1812,8865,13693,14765,319,2694,535,32046,14155,5392,2795,4180,5457,8865,695,5457,13827,107422,1284,5457,71908,31659,56804,5078,7799,414,7799,1755,756,35009,943,183,798,31184,13859,1445,5554,943,473,319,1240,1992,763,867,1857,578,8937,1812,1992,827,871,4485,44078,2781,12622,183,5303,3887,13869,14603,31820,600,3305,113,319,8010,414,15413,1734,2440,4489,2975,30911,44578,60005,215,1812,319,648,181,11145,604,203,4375,6094,1188,793,1014,604,52,2440,104,4225,604,14126,604,52,604,203,7311,604,203,1423,604,929,604,986,505,3038,3307,41650,1111,671,1620,600,693,2975,3930,2028,3930,755,6284,2206,3532,1228,2219,106,1018,501,355,1486,1726,3475,2911,38821 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 604,203,392,9126,4607,604,1733,2600,3768,578,10624,414,827,1857,414,756,14158,414,20701,7753,414,987,13606,4607,8854,285,101,604,203,4901,4610,8930,1037,1387,1111,3809,9504,604,203,392,648,846,763,3705,533,253,4607,604,4202,533,2366,1748,2229,3307,14673,10254,533,1748,2254,5615,1240,2699,414,4607,604,1770,9126,17873,414,175,4403,604,203,1037,17873,414,2440,3470,4607,604,1694,1240,856,5226,1111,4607,3094,604,4878,2600,4180,319,414,4607,604,4607,604,6501,414,24979,1694,13710,693,2975,17873,414,6686,1407,47439,113,319,2316,764,4878,2314,12401,1031,604,397,3328,4607,8854,1240,2982,215,2440,4247,4607,604,1694,3445,1240,215,2634,2992,2699,8289,52,604,2522,4738,2992,1072,156,827,487,828,115,67,2992,602,2699,8289,1199,604,203,442,1970,3553,4146,555,1969,1037,1387,9126,8899,6161,763,4247,4607,604,1037,693,2975,1620,600,13710,33,175,3284,8899,6161,3898,163,6096,600,13661,1240,6161,107,3204,764,8899,13663,6519,4644,1240,13632,13663,2699,4247,4607,604,1240,456,6161,1734,13632,578,1812,578,600,319,9126,4607,604,1240,1037,2228,6297,3686,1240,6501,319,4607,604,1407,1143,600,1240,4218,1240,456,1620,319,3768,4607,604,1240,5198,319,795,686,673,2292,1620,319,1240,535,600,1240,4607,604,2440,4247,4607,604,4180,295,1143,600,1240,8075,2998,1641,3559,294,600,13679,5295,3559,10020,711,2484,4644,31006,1641,3559,294,600,13680,943,3559,1746,702,8345,7595,14066,9126,1240,378,604,1653,1037,6163,3758,104,1240,1240,215,163,1653,4607,604,3758,1240,6161,693,1674,6160,600,1812,13661,14236,163,4872,727,600,4485,3768,13661,1049,1402,522,3146,6820,800,535,959,1240,6161,13661,5826,5929,2769,3898,24534,3898,2400,1240,13661,1402,4675,2119,456,1620,319,16287,13853,3109,3887,13908,9126,319,2834,26636,20701,7753,4459,1812,163,4607,604,1037,319,4459,1812,319,8866,1139,10452,4247,693,535,394,600,3861,104,378,604,203,2440,4247,4607,604,4180,295,1143,600,1240,8075,2998,9126,2273,30925,604,203,101,1770,2889,1037,101,1622,2273,30925,6073,1770,101,4218,252,329,4199,1770,175,30925,2273,101,6853,535,35,4540,764,501,1597,1476,2229,10254,533,1748,535,30925,2273,604,203,101,9126,1445,67068,4270,1240,4607,604,1037,827,600,1812,2316,113,1445,578,1620,8937,1812,8937,1812,6501,1812,3108,827,487,871,889,1730,2560,1072,156,1445,763,867,1857,7799,871,456,1620,1445,3043,2699,604,203,223,2420,5699,5168,1445,11093,600,1200,1161,259,4402,5699,183,5699,943,5699,8623,1696,997,1978,5925 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 610,2560,5009,98424,2982,533,223,259,9239,1240,5295,943,2982,533,2982,533,223,4402,71,392,3540,1240,5699,5295,943,763,533,2316,726,5343,3326,1240,2945,5699,1200,1161,259,2863,9,10,393,4636,3128,393,533,1079,452,7995,4402,1240,5699,183,5699,943,2292,5699,3558,2996,600,2975,490,3261,2701,6248,1240,5295,943,2522,2560,136,1072,156,8628,115,562,156,1409,1367,2254,259,3279,4638,5328,37,5295,943,1240,2982,1161,183,943,601,3637,505,147,5917,2149,505,3561,147,1330,5343,1161,4402,5699,5295,943,1901,3540,505,3544,1329,1423,1958,3176,2998,147,4402,5699,1958,2037,2998,5917,5699,3540,2927,2049,1846,5295,943,414,3814,533,5078,13710,2942,1161,4402,259,1734,6298,113,5295,943,297,319,648,181,4402,5699,5295,943,6031,3128,319,648,181,3246,4402,5699,183,5699,943,2292,5699,1143,589,2149,505,8808,147,637,3128,1676,181,2149,505,3543,505,1423,413,3544,1329,1240,5699,943,5699,183,2292,1330,901,2316,5343,1240,764,4607,604,1240,5295,943,4607,604,8659,2996,1803,827,600,319,578,600,5295,943,3686,14011,578,600,827,7799,5295,943,1111,163,764,759,600,319,8659,764,3305,2560,562,156,846,4529,3234,1240,5295,943,223,3628,2842,1240,5295,943,3043,2699,8289,793,1014,295,223,610,2560,5009,533,5788,253,3027,2211,17443,98424,28,2814,2176,3930,2934,3158,90751,2814,12963,2560,1321,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 6498,1037,943,180,229,393,533,1216,14391,533,1748,4266,452,533,67,3914,660,334,287,533,223,229,5312,533,2366,2566,1335,3304,3667,5593,2358,1436,8144,934,2176,2211,14591,14592,2192,722,6498,1037,943,5963,14659,6573,16687,16687,35118,113,1755,14605,4218,4485,1852,47408,14264,8345,14066,35118,1072,2881,2768,13776,43067,2881,3043,35034,13861,3456,13710,3870,35118,4589,6943,35118,1755,934,211,11093,600,30131,1077,6922,1077,7799,35039,35039,15981,943,16003,2968,579,756,1734,3751,17763,204,579,3516,2577,3162,1641,3096,2025,2185,3758,6413,1852,8133,535,4055,13861,5280,18038,14200,35039,578,600,1812,780,943,2968,1265,11093,600,30131,1077,6922,1077,7799,31690,31690,183,943,6344,827,1812,8623,31690,1284,13720,1812,3999,574,1284,6922,14729,871,578,1325,3456,409,14059,35054,3216,1970,943,15734,407,1888,31690,600,30131,1077,6922,1077,7799,31044,31044,3006,5121,4181,5940,478,3311,2190,3315,13095,35009,4746,1354,5120,3826,4850,17712,5554,943,211,5936,5699,2149,31044,2768,31044,4746,2768,35019,6161,11093,2768,31044,25315,1284,30131,1077,2603,1344,3026,2603,14152,7152,10632,1768,12622,31044,216,203,1663,576,5425,6613,1768,2768,31044,5933,2881,2252,943,4084,1746,13861,31044,13679,43067,4616,11093,2768,3419,600,30131,1077,6922,1077,7799,31041,31041,5933,867,1077,763,867,1077,32694,943,3043,20701,2206,1240,32694,943,2522,2560,2619,136,31041,1284,1325,1812,871,1183,31041,3162,10971,4798,456,1235,23018,4798,945,756,2126,15131,31041,13678,35031,35036,4180,2881,4055,578,1812,943,14264,11093,2768,3295,600,30131,1077,6922,1077,7799,66997,5142,31040,13902,29969,756,66997,4905,31040,31041,3790,5398,13095,20615,214,66997,204,31040,4055,2597,14003,2768,3030,204,31041,66997,1077,997,827,1635,314,3234,3929,4187,487,580,3123,13999,693,66997,1039,1077,31041,31040,9498,13710,3870,6407,15008,9996,524,20701,20701,2206,3764,4798,18186,4218,4565,13336,13827,3751,20701,2768,2881,2252,943,14191,2007,14177,2974,22367,2235,11093,600,30131,1077,6922,1077,7799,5111,66848,5111,66848,3889,934,211,2235,4485,2768,3861,104,2881,2316,25315,2768,943,578,600,1812,1746,1768,11093,2768,600,30131,1077,6922,1077,7799,20701,2316,3889,113,20701,14730,579,1867,2888,113,4187,20701,504,49093,20701,20701,2206,3537,31751,136,216,2768,20701,6474,4485,1852,710,4907,2694,5280,13776,4055,20701,2913,5280,16066,35079,3889,337,2235,49622,6671,560,4593,20701,2881,1734,3470,11093,4055,600,30131,1077,6922,1077,7799,13849,13849,3094,1077,763,867,7799,14729,524,13849,2270,2316,524,13849,13095,214,4942,2185,10404,2597,7571,1240,13661,524,13849,759,2185,13849,4565,524,8287 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 610,2560,5009,98424,7310,3304,2211,7624,1269,3129,343,4357,1240,6264,3416,5295,943,13821,528,28,763,1335,259,5343,1240,5295,943,3311,1901,2982,533,98,60272,2967,3519,2548,98,99,5343,3031,1901,3540,259,7840,1240,297,5699,1240,6264,3416,343,136,4031,19361,3934,4357,2589,2400,1240,5699,5295,943,20793,2168,1367,1240,1827,5699,5295,943,2982,533,2316,6072,3828,392,1367,539,104,259,722,3540,5699,6423,7624,1269,229,3202,223,1200,1161,259,3304,1047,393,4636,3128,393,533,1079,452,505,1423,413,3544,1240,5699,5295,943,763,533,505,1423,3544,2998,147,726,1240,2998,1958,2037,5917,1240,3540,1240,5699,5295,943,424,295,3128,2863,319,648,181,181,4402,1240,5699,5295,5699,943,2292,297,5699,3128,2863,3553,181,2149,505,3543,505,1423,413,3544,1240,5699,943,5699,183,2292,5699,5295,943,329,3550,3261,2701,3760,1240,15787,5295,943,2522,2560,1072,156,8628,113,136,115,156,1240,5295,943,3674,6974,8289,2029,11282,1950,2162,533,2959,966,259,5343,505,1240,15787,5295,943,756,2121,997,4187,2839,2126,579,4639,1077,80,7799,3765,2049,156,4032,32548,175,1269,5295,943,797,415,533,1877,764,3768,4607,604,1877,1240,5295,943,14011,578,600,827,7799,711,1240,5295,943,6477,3458,793,1014,413,3234,8289,420,604,52,966,5343,8659,1188,4402,8659,259,1240,319,52,602,604,1803,1039,600,319,5295,943,1269,827,711,7799,3870,5295,943,1111,1694,3636,600,1424,6519,1240,5295,943,15,1423,505,7302,5917,1423,1329,478,259,294,622,294,5802,46,478,259,5955,2400,966,3760,1240,5295,943,5955,8865,5295,943,3597,809,414,4254,156,19361,2973,343,6697,3882,478,259,5917,1423,1329,1240,1367,98424,610,2560,5009,533,5788,4813,98,60272,163,456,2029,297,414,163,2769,297,5699,15787,5295,943,456,2029,1791,1978,18419,1183,763,394,2722,3834,30870,2316,764,7538,4610,297,5699,5295,35067,5699,456,764,727,5699,11093,2768,943,183,11093,4288,183,11093,966,2484,11093,13861,35009,25315,1391,13861,6249,1746,5699,943,12622,13680,4288,13679,2484,5295,943,581,4638,11862,966,2484,13663,15818,4819,5051,13661,13861,744,13849,177,1696,15820,13860,2768,35067,13975,14066,5370,357,4610,5699,3553,1641,13763,1476,1043,377,3158,2814,295,223,610,2560,5009,533,5788,253,3027,2211,17443,98424,28,2814,2176,3930,2934,3158,90751,2814,12963,2560,1335,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 535,319,648,181,2023,392,5196,9603,8454,6029,24375,9812,2447,78907,13917,3377,393,4636,319,392,1735,452,355,392,3522,5788,3914,319,648,181,3790,6357,319,648,2992,393,4636,3128,1111,2699,259,535,1200,1161,319,2699,414,3304,181,7347,15712,392,5196,323,3962,319,2864,3565,6072,392,14696,3618,319,4706,4794,3897,3204,6869,2699,414,1846,1409,319,101,414,535,319,648,181,319,648,181,2688,5511,5550,14620,3234,1200,4838,3816,1734,6376,44078,3816,271,3637,5270,3043,3128,319,648,1329,107,3013,3304,319,648,181,4058,181,2316,2889,3317,1828,252,3262,1149,3816,2699,414,3914,67,2980,392,5196,2917,6381,535,319,648,181,856,3700,319,2699,414,3914,3475,3514,1264,2992,319,648,6357,1950,1703,648,856,159,3305,3914,3609,581,5699,319,1424,159,285,414,5168,319,13763,2235,5881,319,1424,5699,6070,2030,159,2996,4589,600,13710,2975,986,4007,5804,856,159,6593,3538,1284,2454,1264,13763,159,695,2992,3914,392,5196,3516,2316,3898,1581,6381,3329,8923,3573,1735,357,159,13763,535,3889,319,10147,2968,8658,1871,567,3085,591,104,6281,13763,2899,159,159,2235,5567,1166,7587,3171,6465,6359,3589,2235,1524,943,13861,6974,14279,2967,6070,159,2206,204,1240,1226,13763,535,6675,319,1424,1846,5168,319,3700,3889,13776,3470,578,1812,871,1325,1746,166,535,319,648,181,114,695,3906,555,114,3514,319,648,181,535,319,648,856,1258,319,5207,2176,5699,5203,4589,1423,319,1424,581,5699,581,319,1424,5699,5168,13776,13763,581,319,1424,5699,285,159,5581,1002,6122,7890,319,5207,2310,600,889,856,159,285,13763,5881,319,1424,5699,319,817,1641,5203,535,319,648,181,764,4589,1240,906,6110,414,2023,1970,5203,3614,1143,319,1424,5699,13763,6201,2310,13763,159,695,319,5426,285,159,7894,3538,3538,3538,3538,5581,535,319,648,181,1970,695,695,695,695,695,695,695,695,695,695,181,648,297,319,5207,1256,319,906,2310,600,889,1256,319,906,600,1734,319,1424,581,319,1424,5699,13763,581,319,1424,5699,285,159,600,285,159,319,1424,5699,2310,600,889,2899,285,159,600,319,1424,7084,5699,285,159,600,13710,285,159,2310,600,889,2725,66172,3516,1423,5832,1424,695,3538,695,3639,5529,14214,2768,1304,4055,1304,5040,1594,3497,1970,5699,2185,13710,13763,2235,2310,695,1970,319,2235,285,159,600,889,695,695,760,2899,695,585,285,159,2310,600,889,5962,319,1424,5699,13710,660,695,695,760,10337,695,585,285,159,600,889,319,2235,1846,319,1424,5699,1812,600,695,695,760,695,695 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1335,3304,1335,5469,103,533,5958,1335,2862,271,377,3914,287,2935,1488,6995,280,1567,2029,4381,8918,393,533,1335,3304,4357,2211,67,1240,6264,3416,5295,943,13821,3934,343,5485,763,1335,259,5343,1240,5295,943,3311,1901,2982,533,259,7840,1240,3117,297,5699,1240,6264,3416,1329,3934,4357,2113,14367,17750,8918,20793,2168,1367,1240,1827,2899,5699,5295,943,2982,533,2316,6072,3828,392,1367,539,104,259,722,3540,5699,6423,8918,4087,533,4730,24431,505,1423,1240,2899,5699,5295,943,763,533,505,1423,2998,147,726,1240,2633,2998,1958,2037,5917,1240,3117,3540,1240,2899,3117,5699,5295,943,424,295,393,4636,2863,319,648,181,181,4402,1240,413,3118,5699,5295,2310,2899,5699,943,2292,2899,3117,297,5699,3128,2863,3553,181,2149,505,3543,505,1423,1240,2310,5699,943,413,5699,183,2292,2899,5699,5295,943,1200,1161,259,3304,1047,3128,393,533,1079,452,4402,505,1423,1958,3176,2998,147,1240,2633,5699,5295,943,1958,2037,2998,5917,1240,3117,5699,2927,600,2975,329,3550,3261,2701,3760,1240,5295,943,2522,2560,1072,156,8628,113,136,115,156,1240,5295,943,3674,6974,8289,2029,11282,1950,2162,533,2959,966,259,5343,505,1240,15787,5295,943,756,2121,997,4187,2839,2126,579,4639,1077,80,7799,156,4032,3004,175,4087,24431,5295,943,797,415,533,1877,764,3768,4607,604,1877,1240,5295,943,14011,578,600,827,7799,711,1240,5295,943,6477,3458,793,1014,413,3234,8289,420,604,52,1188,794,966,5343,966,505,4402,764,8659,1240,319,52,602,604,1803,1039,600,319,5295,943,4087,24431,827,711,7799,3870,5295,943,1111,1694,3636,600,2316,764,7538,4610,2899,3117,297,5699,5295,35067,5699,456,764,727,5699,11093,2768,943,183,11093,4288,183,11093,966,2484,11093,13861,35009,25315,1391,13861,6249,1746,413,2310,5699,943,12622,13680,4288,13679,2484,5295,943,581,4638,11862,966,2484,13663,15818,4819,5051,13661,13861,744,13849,177,1696,15820,13860,2768,35067,13975,14066,5370,357,4610,3117,5699,3553,1641,13763,1476,8918,1043,377,343,3115,223,343,136,4031,259,136,3071,259,14127,2886,355,156,52,139,343,4209,392,1014,2270,2982,533,1362,2270,2883,2886,229,223,9,12622,183,943,2886,9,10,393,4636,223,2162,225,287,14,2970,392,1960,324,8918,223,3202,8918,393,533,4761,2927,4587,5416,2270,3431,14673,533,1748,37176,67,2211,7471,22428,37176,7461,1963,13446,223,3202,1623,938,37176,934,1335,3304,37176,934,514,531,2638,2913,3681,533,660,334,156,1597,542,2273,857,3771,8214,533,2366,2785,8918,287,533,1008,764,3106,3522 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 7753,13975,14148,13679,535,3128,6465,268,319,568,223,393,4636,101,172,13975,7753,14148,7753,204,4861,2597,13679,13975,7753,4878,5280,14066,14212,1304,35167,5396,3639,13975,7753,10020,2420,14229,1599,711,163,11093,5699,392,67,13975,7753,578,1812,763,867,1077,1077,7753,2967,1599,763,867,1731,297,2672,11093,13975,7753,5699,943,1424,319,648,181,184,1674,13829,4084,4288,3281,3064,1795,1674,1968,13975,7753,4482,4758,13674,535,285,4123,271,7753,184,3281,1330,271,15716,101,535,535,1641,14148,13975,7753,6981,14229,711,1599,1599,13697,41,31004,204,4878,18318,6161,2881,14229,14148,13975,7753,14122,25088,702,5210,2768,943,12622,13680,13679,7753,14038,13632,13661,13763,1784,574,392,1037,5699,2185,13975,7753,5567,711,1620,5699,600,1812,923,297,2672,2292,1812,8937,1812,871,1325,2292,10624,1200,7799,166,1857,1077,1077,1731,4192,966,297,2672,2927,600,414,705,1785,943,8854,5529,3063,1785,14148,13975,7753,106907,14612,68773,14066,8381,2420,4706,13680,5168,943,11093,2252,2768,1643,2420,11093,25088,34806,35071,702,13763,2911,8935,7753,1766,1540,1785,14329,795,14179,13809,13826,1812,7054,13975,7753,68773,14066,943,2768,578,2396,943,10404,2881,11093,1643,3623,10011,14612,702,938,5699,163,5699,6922,6922,166,1857,1077,1077,2977,6922,1731,4192,6922,6922,392,67,5699,705,1785,943,600,600,1812,2292,1812,8937,1812,871,1325,2292,10624,1200,7799,7753,1144,14177,11093,166,11093,2795,13789,5457,13789,35098,14148,13975,7753,106907,11093,19151,1391,15206,21370,13789,68773,14066,13789,25119,13763,2911,1474,392,67,5699,7753,1144,14177,4628,5280,13606,35105,7054,1674,2577,4482,4758,1435,163,11093,5699,14612,600,600,1812,2292,1812,8937,1812,871,1325,2292,10624,1200,7799,6922,6922,166,1857,1077,1077,2977,6922,1731,4192,6922,6922,13975,7753,26659,13869,11093,14655,11093,166,14612,13789,13693,14156,13789,13693,2568,13789,3063,35124,8381,13789,3063,26660,13789,3063,31012,8381,14148,13975,7753,106907,11093,35111,8345,15697,1992,11093,711,13763,2911,8935,7753,1766,14272,13770,14280,8133,14655,13693,2695,1391,13771,5210,14655,166,13693,14156,13693,2568,26659,1746,7753,35111,1992,711,13792,578,1139,5442,5168,293,10078,574,5328,13771,827,1139,5442,3885,3229,10078,13771,14141,5567,2695,13693,3885,18401,4745,355,3096,898,4084,2695,4653,8441,3885,13336,7595,702,26687,163,5699,392,67,5699,13975,7753,26659,13869,871,6922,166,1731,6922,1325,6922,1857,4192,6922,2292,10624,1077,2977,1200,7799,1077,6922,13763,3083,3128,252,7362,393,4636,319,392,452,3128,3250,830,223,1014,3663,1075,1663,343,3846,5832,1423,1737,2133,620,2449,830,5233,3128,2141,2322,748 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 392,533,1200,1161,259,4468,319,1240,793,1014,602,3445,604,414,473,101,943,5295,414,578,1812,8937,1812,871,1240,1734,319,414,3046,5457,1325,414,3046,166,987,20597,3352,44078,6421,3916,393,4636,393,533,1079,452,1200,1161,259,1240,1734,319,4468,319,1240,793,1014,602,3445,604,414,473,101,943,5295,414,578,1812,8937,1812,871,414,3046,166,414,3046,5457,1325,987,20597,3352,44078,2176,392,533,1200,1161,259,259,1240,7385,2699,1161,3897,1111,3603,253,5615,2699,259,1423,1329,319,5207,3814,533,216,156,3031,1200,1161,259,414,2316,600,473,101,943,5295,34806,1599,101,5529,1304,1594,5040,4288,798,600,1812,31007,1240,442,3035,5808,2176,2176,2176,2176,3419,2176,319,5207,3558,16,1211,3106,394,13710,2975,764,1240,319,11230,2206,6504,6629,3146,100,935,3470,764,3516,319,856,6161,7681,3609,4589,12661,3470,4628,319,163,31751,414,414,3234,533,1001,442,5038,3701,420,4424,2665,794,533,1967,2206,16,156,2560,2665,693,604,1812,568,487,828,487,871,357,1111,764,163,8277,3705,3547,3445,533,8697,319,5207,2316,12661,2889,3547,31751,414,1111,505,3764,2992,15,9510,764,1423,175,7590,4539,2440,319,5207,1111,2176,2522,2560,562,156,1072,156,136,115,9314,25513,4498,378,1436,1737,259,763,414,2522,100,2560,2665,562,156,2665,1188,827,487,828,827,487,871,319,1284,394,13710,6076,794,533,764,567,394,4639,13710,13710,4639,693,163,1856,319,4639,13710,1077,80,313,314,23738,314,319,1284,6076,7799,3234,533,319,6076,1409,3452,693,567,3839,533,764,1731,4066,602,3751,716,357,13710,5473,10624,1812,1857,319,5218,394,6354,600,10624,1857,600,13720,1812,5881,4022,600,13720,611,13710,4038,394,600,13720,319,827,1812,827,600,34806,38949,319,827,600,793,1014,5998,31751,414,600,2975,3637,1423,889,1014,1330,5343,319,3043,2331,6715,1014,3600,6520,2998,2996,764,3768,4607,604,1240,319,3516,13710,12653,319,33,3031,13710,2975,18318,414,3484,259,2998,8808,8289,66828,1730,600,4928,297,1014,1111,602,533,3503,764,1240,13632,21450,414,31751,414,31751,414,1284,1620,4639,13710,600,216,392,6720,25098,31751,414,1790,4468,10624,1812,1857,2522,2560,562,156,3043,759,7590,8289,414,1856,1734,319,2968,2956,21450,4402,1200,874,3756,13710,4402,1200,874,66172,2168,1620,13710,5078,3031,2975,2316,2699,764,764,1317,13710,388,3898,1240,5078,889,66172,414,3031,66172,3237,8865,4639,13710,2316,2699,764,1200,1161,3609,319,5207,1111,3031,3540,66172,1200,1161,589,414,5041,285,2030,6161,319,1200,1161,3609 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1200,1161,259,4224,4066,763,533,1240,442,3035,5808,319,3470,4066,2699,414,8289,3094,2769,5207,535,7681,1111,2206,1826,3470,5936,319,412,3547,763,533,7681,3123,2310,6077,1367,10562,533,2206,3352,319,1407,8865,166,3700,319,5457,987,20597,3352,44078,3118,1161,1111,163,25180,5207,3814,533,2522,2560,562,156,5936,319,3043,2699,414,795,4304,49359,1812,4529,8937,1812,166,5457,611,1199,1412,672,319,827,8937,1812,166,5457,1325,2987,555,7681,2600,4224,4008,4066,2699,2927,25180,4224,4066,763,533,3014,1161,7681,3814,533,2522,2560,562,156,1072,156,136,115,9314,25513,156,4498,378,1436,1737,259,319,5207,8289,3106,10722,794,2560,562,156,4529,3234,3556,1200,1161,7681,1826,2206,16,156,2560,2665,156,163,8277,3705,3445,533,1161,7681,1111,2119,3547,763,533,7681,2600,2781,11934,3234,2254,1641,3014,1161,535,7681,1826,3470,4224,4008,4066,2699,2927,25180,3768,4628,4453,4737,319,21450,2699,1240,8075,2998,1694,319,1770,1240,939,1161,2025,4247,763,533,1161,3921,2699,505,1423,1329,1330,5343,1423,4224,4008,4224,2699,604,8075,2998,3014,413,1161,1111,1694,2206,2699,6094,2699,1240,603,793,1014,9510,764,1423,175,7590,5936,442,4539,2440,1111,505,3764,2992,15,4066,2699,2927,181,648,319,5207,1734,473,297,4529,473,1734,5295,943,297,1694,319,1770,1240,4224,4008,4224,2699,604,4224,4008,1712,413,1161,3014,3118,1161,4066,2927,2699,1240,319,648,181,648,13710,693,2975,163,473,5295,943,1362,6161,560,2927,763,392,763,533,2522,2560,562,156,5899,67019,3768,271,5207,2310,1424,3281,13632,1039,600,319,4218,1240,1240,2119,3546,1694,319,1770,1240,4224,2699,604,8075,2998,2176,3344,8289,4628,25180,1240,603,793,1014,1149,763,533,2440,5343,2722,1653,604,4607,604,8659,1188,1730,2560,827,487,828,1072,156,9314,115,113,136,8346,10508,986,2699,604,1149,795,2699,442,25180,414,578,8937,1812,871,3046,2292,1812,1200,1161,259,1258,693,604,5343,505,4589,870,535,1826,604,1790,8293,5343,3556,6168,3224,1258,604,104879,693,694,459,8325,5343,8325,1720,1412,2699,2316,2699,604,357,3094,1812,217,8325,2699,1720,2699,2316,764,3416,3094,217,1391,693,3688,1812,8325,2699,1720,1039,128427,2560,2279,8325,2699,1720,1877,604,203,4529,533,2560,2665,3224,8325,4861,2699,1720,2699,3030,2144,2030,7487,693,2185,505,505,9,10,8659,4310,353,693,2185,4202,533,2366,1748,1694,3568,604,14916,1074,2119,3547,1730,8325,2944,3295,1827,3768,2722,604,1653,6185,1423,637,14916,1074,1730,5237,1653,1812,4607,217,2119,3546,1240,2998 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 319,601,3602,2316,4181,319,1653,9614,8581,19576,11643,2814,42648,622,705,3822,539,1317,600,601,403,889,705,3494,1653,319,601,5366,3261,11454,376,4064,6469,705,2316,705,1317,297,601,3882,600,1832,10890,966,1730,889,600,695,202,539,600,601,4692,3600,795,796,5494,1317,966,600,601,403,3245,8865,319,434,600,319,8940,2968,1079,601,3224,319,4468,1387,660,202,3876,6492,2029,6869,539,414,5874,3855,5215,622,5495,4752,600,60862,7152,7707,4442,966,4752,1563,1812,3800,966,12838,4752,600,943,14155,5799,966,4752,1304,15404,966,705,4752,27553,60863,478,357,3121,600,601,1730,4819,4941,54193,4432,2681,202,319,4468,1387,660,319,601,5494,2927,9,2162,319,4636,940,22473,3525,1752,319,703,2485,601,3018,2316,705,539,4181,3121,319,601,3018,343,889,535,113,319,4468,1387,3013,2996,6465,889,319,601,858,3649,705,319,4468,1387,67,705,1317,3121,297,319,5218,2927,268,382,703,1969,535,2292,5218,268,3068,571,703,3350,28784,2009,21563,319,4468,1387,434,3245,319,601,570,203,2331,319,591,3694,319,5218,3018,1620,980,7412,535,2968,4038,1209,1082,535,1369,7205,319,14528,2339,209,3694,2883,3694,2331,3473,3062,203,3121,319,601,3018,3847,2292,319,5218,3780,46,5236,705,319,4468,1387,2316,6211,5511,434,795,796,5494,343,319,2968,319,6869,2725,319,535,392,388,6211,3614,6320,705,3622,319,3350,3031,392,2975,343,1317,3083,319,4468,1387,5258,3234,8047,5494,394,13710,8865,2996,6465,46,1424,3305,705,5584,14672,1744,2485,18425,610,3784,397,452,3128,4357,3308,319,601,3602,3121,601,1317,600,4851,966,539,1317,2316,3494,1730,600,601,966,1752,2316,202,3283,3281,1354,1730,2795,553,2589,622,3822,601,36023,1640,25984,202,600,601,531,478,705,3800,966,6235,2992,705,600,601,5799,966,2331,3751,1653,4636,3673,531,478,202,600,601,2992,705,6235,4692,2681,1329,4428,9,10,4356,3597,809,539,1317,600,601,2992,705,6235,14917,600,1832,2479,5940,4851,107,600,601,5323,413,3860,4527,3121,600,601,4442,600,600,5323,600,601,4850,4819,3910,54193,5323,622,11097,3002,1065,856,2347,780,1744,2948,1653,26790,2347,14887,2029,319,601,4589,4181,2029,7398,3224,539,4181,601,5374,905,202,3608,966,8940,600,2968,601,9,10,3597,539,1317,21637,539,1317,966,9,10,3600,27553,5829,6449,705,3503,600,601,3764,3085,413,3860,4527,966,1317,5940,4490,601,3942,4356,4527,1317,600,3121,600,601,1730,4022,1733,2992,705,6449,705,4432,1039,46,202,2992,705,3043,1730,2331 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 4610,3470,2899,1240,6255,1734,5295,943,3768,7571,13661,12622,183,14264,35588,2807,5936,13693,70,34741,1746,13680,943,7753,5159,319,648,181,175,297,442,744,163,14413,14187,13975,702,5396,4533,183,1968,14585,3768,271,13763,2967,5295,943,727,600,3819,3323,3602,5295,943,1761,600,12070,67,3219,780,2322,287,533,392,1754,958,3128,319,2511,223,3502,1989,1775,2388,173,6837,23901,3158,90751,2814,12963,392,2119,2817,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1200,1161,259,4224,4066,763,533,1240,442,3035,5808,319,3470,4066,2699,414,8289,3094,2769,5207,535,7681,1111,2206,1826,3470,5936,319,412,3547,763,533,7681,3123,2310,6077,1367,10562,533,2206,3352,319,1407,8865,166,3700,319,5457,987,20597,3352,44078,3118,1161,1111,163,25180,5207,3814,533,2522,2560,562,156,5936,319,3043,2699,414,795,4304,49359,1812,4529,8937,1812,166,5457,611,1199,1412,672,319,827,8937,1812,166,5457,1325,2987,555,7681,2600,4224,4008,4066,2699,2927,25180,4224,4066,763,533,3014,1161,7681,3814,533,2522,2560,562,156,1072,156,136,115,9314,25513,156,4498,378,1436,1737,259,319,5207,8289,3106,10722,794,2560,562,156,4529,3234,3556,1200,1161,7681,1826,2206,16,156,2560,2665,156,163,8277,3705,3445,533,1161,7681,1111,2119,3547,763,533,7681,2600,2781,11934,3234,2254,1641,3014,1161,535,7681,1826,3470,4224,4008,4066,2699,2927,25180,3768,4628,4453,4737,319,21450,2699,1240,8075,2998,1694,319,1770,1240,939,1161,2025,4247,763,533,1161,3921,2699,505,1423,1329,1330,5343,1423,4224,4008,4224,2699,604,8075,2998,3014,413,1161,1111,1694,2206,2699,6094,2699,1240,603,793,1014,9510,764,1423,175,7590,5936,442,4539,2440,1111,505,3764,2992,15,4066,2699,2927,181,648,319,5207,1734,473,297,4529,473,1734,5295,943,297,1694,319,1770,1240,4224,4008,4224,2699,604,4224,4008,1712,413,1161,3014,3118,1161,4066,2927,2699,1240,319,648,181,648,13710,693,2975,163,473,5295,943,1362,6161,560,2927,763,392,763,533,2522,2560,562,156,5899,67019,3768,271,5207,2310,1424,3281,13632,1039,600,319,4218,1240,1240,2119,3546,1694,319,1770,1240,4224,2699,604,8075,2998,2176,3344,8289,4628,25180,1240,603,793,1014,1149,763,533,2440,5343,2722,1653,604,4607,604,8659,1188,1730,2560,827,487,828,1072,156,9314,115,113,136,8346,10508,986,2699,604,1149,795,2699,442,25180,414,578,8937,1812,871,3046,2292,1812,1200,1161,259,1258,693,604,5343,505,4589,870,535,1826,604,1790,8293,5343,3556,6168,3224,1258,604,104879,693,694,459,8325,5343,8325,1720,1412,2699,2316,2699,604,357,3094,1812,217,8325,2699,1720,2699,2316,764,3416,3094,217,1391,693,3688,1812,8325,2699,1720,1039,128427,2560,2279,8325,2699,1720,1877,604,203,4529,533,2560,2665,3224,8325,4861,2699,1720,2699,3030,2144,2030,7487,693,2185,505,505,9,10,8659,4310,353,693,2185,4202,533,2366,1748,1694,3568,604,14916,1074,2119,3547,1730,8325,2944,3295,1827,3768,2722,604,1653,6185,1423,637,14916,1074,1730,5237,1653,1812,4607,217,2119,3546,1240,2998 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 392,943,5295,2899,5295,943,4638,3516,20793,1111,3814,601,319,319,648,181,3328,2899,5699,5295,943,1330,2998,764,2149,505,5041,600,2998,147,1151,3176,2316,5917,5041,600,9239,4224,2633,5699,2998,5917,827,600,2975,3117,5699,943,5295,1111,294,2560,136,533,986,259,4031,136,397,91236,4402,2899,939,5699,581,943,5295,2184,943,473,473,763,867,1077,14729,2184,943,393,4636,319,648,181,2184,1424,943,10624,600,3870,2184,1039,2316,943,8096,764,115,3340,1424,2184,827,10624,319,2707,13860,1111,52,487,166,4288,183,827,394,827,600,319,394,319,6354,600,2185,6354,9995,1673,4288,183,6334,600,13710,319,827,600,67068,3558,2292,1143,600,5041,4459,3531,5699,4288,183,6421,11093,456,16287,764,2998,827,600,2975,505,726,1391,3623,13632,4247,1746,6334,1620,600,5062,456,1620,600,12622,183,2982,5207,34741,581,943,5699,3860,11093,34741,581,943,5699,6679,14215,943,2316,764,727,34741,409,4613,13975,101,796,3326,4761,1720,14215,183,943,6679,7810,5862,14066,34741,1761,1746,27903,13827,319,3822,392,2672,357,34741,2927,5295,35021,31657,35590,2280,4529,763,13703,1594,5040,3486,52,1222,3486,52,1222,3486,52,1222,3486,52,1222,3486,52,1222,3486,52,1222,3486,52,1222,3486,52,1222,3486,52,1222,3486,52,1222,3486,52,1222,3486,52,1222,3486,52,1222,3486,52,1222,3486,52,1222,3486,52,2213,6484,5482,856,8738,3244,6486,8079,3486,52,1222,3486,52,1222,3486,52,1222,3486,52,1222,43791,45,37278,8960,3371,72432,55501,3129,3486,52,1222,3486,52,1222,3486,52,1222,3486,52,1222,22171,1524,8014,72479,223,3486,52,1222,3486,52,1222,6755,54953,3158,85882,28,2814,139,124712,392,2817,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 181,4064,3603,1149,16587,1423,24519,13725,35111,14153,35051,47724,1599,47724,1599,2630,7595,2630,7595,2630,7595,2630,7595,1785,13677,1785,13677,943,13677,943,13677,13975,2484,14496,14496,997,2484,5392,13859,579,2707,579,2707,29183,29183,29183,14154,14122,35063,938,3860,35063,5328,3860,16587,14612,35111,183,943,2484,11093,1989,5699,16587,4727,1901,1143,5699,1424,16587,31698,8865,3608,600,3540,1423,3038,930,727,3470,6715,1143,600,5041,5203,16587,2975,987,24519,6359,13725,24519,600,11093,1696,2484,600,987,711,600,1240,11093,2630,7595,5370,413,6359,600,2630,7595,16587,12622,183,31657,600,987,11093,47724,1599,600,2630,1599,3281,2630,7595,600,16587,535,35111,29183,2707,35111,600,14612,16587,1240,15008,9996,2768,13849,5370,2942,2254,943,2975,2994,6160,600,2270,14486,229,392,393,1018,393,1960,3542,958,280,3128,3353,223,3158,4302,229,1560,4302,11847,81937,181,16587,2817,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2192,722,2862,3800,8014,128941,4357,2192,722,259,1240,6161,3783,934,934,901,1240,15,744,5343,1240,7709,21496,932,1240,4878,744,3578,744,337,581,932,3224,744,2935,3823,1540,13908,744,3456,764,1240,2974,6228,1329,3934,5295,943,3889,5487,3448,3628,1735,3805,1240,934,3897,2699,6161,3031,2996,2975,223,3628,3310,578,1812,183,943,3859,574,13861,13849,177,2694,70,14413,10734,1240,8918,337,2998,2908,223,163,4610,25095,2699,3859,1476,5198,337,2908,5593,4610,1730,183,943,5699,6974,14227,3768,1746,13975,14187,14413,1746,13679,13680,943,7753,2252,13808,5396,456,2484,5295,943,26470,26670,13908,22827,13801,13908,14613,13661,49714,4288,5295,943,2597,18318,312,294,1812,2413,3887,13679,5295,943,2484,2292,5345,3859,12622,13680,4493,13679,943,5457,12622,392,2672,13679,5295,943,6607,12622,13680,13679,5295,943,1770,3859,12622,764,4820,2003,3339,1240,163,2975,2888,337,1214,7716,3333,3096,295,2600,6504,2292,14485,337,4180,3623,3860,2525,337,2522,600,3623,1391,3038,6330,1214,2119,934,4758,3823,319,3847,6161,3046,3623,4225,1240,1240,3623,2119,934,4247,4481,43029,319,3261,7817,20771,5370,695,8900,13674,319,3038,6330,1214,10045,13908,2630,13698,5159,4758,5295,943,204,763,763,7482,1877,139,136,10020,13710,1877,216,1072,156,2358,10384,764,2967,1827,3928,1240,5295,943,3561,1188,5295,943,578,600,827,7799,13710,10020,3859,3834,827,1812,600,16637,13661,574,13776,1617,4224,939,5699,5295,943,5699,2768,943,4180,183,11093,5699,4288,183,11093,14612,5699,2484,11093,2420,2185,1317,816,11093,5699,35009,943,11093,1317,13849,2280,1696,997,5699,3757,2899,2292,5699,5295,943,4628,5699,943,413,5699,183,357,4288,798,13851,31748,35036,13632,2913,13808,581,943,8126,13851,7753,26552,798,13693,798,48969,31748,7753,15121,13851,1746,13861,2254,763,441,1857,1111,3031,3053,3623,2185,2316,8930,1676,1735,3742,1729,3623,1391,1735,600,808,357,2316,764,2420,1304,5699,2185,4707,3146,6262,2185,14764,16122,1162,10734,3889,3742,2254,3337,285,1304,6161,3352,6032,987,816,312,13680,592,312,5396,600,1746,1812,166,1391,3623,2185,18018,357,8623,592,15117,29139,2420,600,2725,2420,11862,47724,1599,7054,11093,14496,2630,13698,13789,4904,3549,2292,600,1599,5699,183,5699,8623,592,15117,55596,30622,2420,600,2725,2420,997,2484,6265,5168,2420,14562,80,711,13827,95652,2292,600,2310,183,5699,29901,7054,20175,2420,600,1989,2310,1391,31657,2316,35063,2725,1441,1555,1008,5699,2707,35063,2753,1989,3085,1183,1506,14598,3715,3085,35063,13827,6609,2310,2707,5699,600,26685,17598,456,7160,26685,3326,2707,5699,1391,25955,2185 0 9326
+943,600,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 343,392,1795,6244,1799,975,3773,6244,3646,2699,1240,2699,2842,4740,6244,3227,1423,6381,163,1516,37677,15727,1008,650,2951,7108,3736,693,3425,5509,5546,490,2960,259,37677,1877,524,482,6070,693,2065,147,62542,16923,2119,930,37677,3471,2359,442,37677,4008,693,1986,18033,217,7026,2781,37677,1908,1734,37677,3710,1111,4361,217,435,693,37677,4529,7579,4361,295,217,2522,294,295,986,37677,7026,764,727,37677,607,5012,5899,693,1870,7472,28616,21473,4304,14011,5899,37677,37677,29173,7138,693,5899,3751,104,37677,5899,37677,4468,37677,6675,4468,693,3736,4639,3839,533,34751,3147,763,793,4468,2522,2560,2439,442,4365,1496,4529,1330,764,495,4468,1111,5221,2273,8336,7136,297,442,37677,394,37677,17816,1014,8075,495,37677,3710,3829,382,13999,1003,382,487,693,6671,37677,930,12524,3710,104,24888,5110,5829,6976,3317,107,4686,764,37677,4539,447,3588,2982,3807,385,5152,11196,3761,37677,3329,1455,6265,686,673,10508,3809,3736,35136,4235,37677,447,5009,37677,693,1908,5050,37677,930,2968,705,15184,5270,1355,2479,7321,2914,533,4008,5352,37677,1149,1826,930,6820,6094,8289,343,392,1795,6070,370,3353,223,1240,1790,230,1754,9483,319,392,17006,4163,353,2951,5070,3756,10673,901,1423,60,7201,935,1567,1001,2975,4081,7278,3856,935,7792,1567,6412,7328,7574,2603,60,319,14950,800,10673,7278,6311,7211,2746,2992,5343,960,1180,901,1423,1424,5939,6519,104738,222,931,935,6311,6248,3757,4218,1240,764,1240,10673,1001,2149,764,3269,2992,14962,3835,2672,26631,1567,1790,1419,763,899,3043,320,3684,672,34780,935,2467,533,2634,3234,726,5343,11282,2635,10673,10673,3535,3234,10673,1183,5936,1775,4752,6693,4589,1424,1228,10673,2012,1985,3234,93,2558,482,6520,505,764,1737,1149,1676,105391,4163,52,4064,3106,1985,163,3705,2746,323,1432,4484,1111,2254,10673,3094,4738,3532,846,5207,2699,319,5207,3918,6161,13661,3234,2366,1663,4526,205,204,13554,4706,319,3352,10673,319,7571,385,1240,10673,12796,95092,5343,2126,13974,14179,1330,4641,727,945,574,12796,1049,2367,8123,17992,727,3053,1744,319,3352,101,35111,87313,13729,1380,7806,2630,14158,10798,16351,3234,10673,3757,752,3573,722,2252,10673,3082,834,3281,3233,3897,10673,16209,3215,3158,1474,3215,3158,1474,3215,3158,25183,1474,3215,72674,901,3625,1474,343,392,1795,6070,370,3353,223,1240,1790,230,1754,2699,604,3834,3835,3515,5181,604,929,4638,604,693,1180,259,4224,2699,604,8930,3742,16693,5130,1211,6340,7587,693,1180,2316,2467,764,3962,6987,4398,5529,15316,4015,25128,10393,15078,1111,7428,1317,259,2145,104,3819,3583,7487,693,6537 0 9326
+213,2679,201,8,1003,162,130,808,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1880,501,1881,1003,213,2679,8899,11796,501,1881,1881,1388,11643,9789,4074,11058,1146,13535,8949,31466,12676,7375,3371,8255,41957,3102,6781,41958,1524,18547,37201,16490,11642,8783,11342,6483,10900,9353,6588,42135,6799,6922,9800,9082,5963,41959,11554,12421,10770,3060,41960,2005,41961,1003,213,2679,3906,2176,7862,691,330,2109,252,3529,3700,252,252,4539,252,3529,2488,2672,2793,3030,1791,2560,2974,5004,7862,1003,2679,691,330,1623,938,95855,213,13441,48099,213,13441,2109,1623,938,1003,213,2679,320,1856,2461,1256,1003,10527,252,3529,1623,938,14016,2382,14016,805,8388,535,6682,11405,4789,2679,2679,4586,535,805,8388,4009,559,10109,1866,5829,695,602,1086,21560,13820,2679,576,13794,546,40040,6351,456,9995,35127,2967,576,2679,213,4745,2793,10527,15463,1003,10527,456,17253,4392,213,5312,828,3230,377,2755,2369,13785,3457,14016,2382,1856,4909,2679,3523,4218,2119,3885,5312,3606,4218,2119,285,3700,252,1623,938,213,2679,1003,3013,14016,2382,14016,805,8388,42214,3529,41,9962,10616,2679,634,1273,560,3234,3122,3686,2679,21560,13820,678,505,793,1318,591,252,3523,3558,353,1423,4491,3666,6127,889,2018,1409,67,2553,3700,353,3014,1388,10930,353,1423,678,252,3523,591,2358,7162,252,3523,591,1329,7882,252,3523,591,1329,42152,252,3523,591,1329,885,252,3523,591,1329,252,4539,1623,938,1003,213,2679,10616,546,1245,40040,16723,10090,4539,828,4568,5888,296,213,8379,1003,252,3529,1623,938,213,1003,2679,3529,2793,784,3311,2325,1003,1003,14016,5335,252,4218,3529,1519,3674,1391,2793,14016,2382,805,8388,2316,2793,3759,5779,1337,1601,42214,2488,2672,1623,938,2488,10527,14481,202,1211,3529,2488,2793,3030,1791,1623,938,848,6349,1844,1003,43,1830,31119,580,1003,136,43507,42127,3671,10555,5877,53883,1003,19234,18019,10613,3586,2003,496,3553,1597,252,3529,2344,136,1003,1830,1003,1416,2560,1623,938,2560,4177,1003,2755,43,213,2679,3529,252,3586,5100,38498,11462,53441,475,25032,1686,487,23224,496,113,7023,53268,3467,487,18666,14017,8628,18047,73720,15060,1790,10875,6097,14017,8628,3030,3947,1003,156,113,1072,636,2974,5004,1623,938,634,4177,1003,3861,7806,5934,1072,809,5934,7707,2839,576,4627,634,349,773,533,2366,2388,4909,3930,2028,3930,999,13531,755,14017,3770,2366,2219,106,1018,501,355,1486,1726,3475,2911,38821,2155,3651,67,2911,535,501,1642,6585,2077,501,784,10429,6656,6653,6585,2077,501,1597,3471,501,1642,2566,377,2911,67,3939,4137,377,265,17665,7366,568,67,3247,3248,3250,533,1388,35,67,1881,8107,1335,274,2794,934,265,5569,5779,3662,1161,343 2 8946
+213,2679,201,8,1003,162,130,808,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3700,213,13441,2679,3700,213,13441,2679,67,6171,2206,1337,3523,3471,213,13441,2679,6423,1716,3523,808,1226,213,13441,2679,213,13441,2679,213,13441,2679,3523,1111,2229,1519,312,2144,4398,213,4745,694,10403,1996,580,2461,31146,3416,213,13441,2679,1770,5189,2606,3523,100,2606,2679,2722,3529,213,13441,2679,2067,312,677,213,13441,2679,1843,2181,5097,3589,2606,3523,1856,6585,213,13441,2679,3642,213,13441,2679,113,2679,3529,413,2781,2679,3529,10403,694,1716,253,2888,15463,2679,3529,6067,2635,2077,1856,10527,2974,107,3013,343,4031,533,2229,3195,2679,2560,1877,3523,2679,1712,2560,3310,5564,1877,21123,2560,213,13441,2679,1770,446,693,1968,2606,2679,3529,2679,2679,3529,1337,32225,2229,2974,190,3529,5562,109676,2382,3523,3529,2679,535,2382,4838,1214,1483,3471,48223,3083,1832,6130,672,2488,2793,580,278,355,2229,4218,3083,2679,2119,3281,2679,3529,3523,4398,213,535,4392,580,1754,15463,694,693,580,5236,48223,2119,285,48223,163,6585,5236,1969,2679,3147,6585,2967,580,4392,213,13441,2679,672,8221,3782,213,13441,2679,591,3583,3523,2119,138,138,6359,40288,40556,40449,40573,3523,2229,3340,2119,38591,3038,1240,3543,104,3523,907,805,8388,4586,5236,987,1284,2382,6530,1754,12236,6704,6530,1754,3583,1615,5236,2159,26820,575,1754,3523,3775,487,175,487,581,2664,4364,2454,2679,2755,496,3092,3523,487,20820,40155,2369,734,104,252,854,5236,278,355,2229,6171,388,5942,1337,8860,1476,3657,648,435,2679,3529,3027,3885,1226,104,4529,722,4259,6530,1754,764,175,3523,62607,3234,2440,3529,2679,1226,104,3782,2679,5879,1476,1337,8860,393,3031,32225,3529,2679,32225,2600,3523,3603,253,3038,634,8277,1273,560,591,2029,873,42980,4888,634,7707,487,828,3280,3558,1716,2679,6704,37,1002,3230,380,1936,14669,2181,5236,31145,37,2181,57,4259,2159,42054,10182,2119,3523,13272,2400,2679,3234,3807,5232,3038,2119,7806,2923,1086,1086,1086,4218,4009,295,32225,4610,3616,435,2679,576,435,40831,4084,40206,1376,14241,17632,2606,14089,40206,3457,8379,435,576,8098,1812,217,1789,546,40040,213,1971,32225,2382,1601,6682,694,2679,213,1662,694,213,1183,11198,795,4398,4218,3843,213,4745,5313,213,4745,8129,3147,2781,213,535,648,213,3230,3548,11405,1086,1662,1856,580,16536,252,48223,3529,694,456,1662,3583,1086,3284,213,1641,808,413,3118,213,1662,2679,213,3230,694,580,8129,5236,48223,48223,580,175,2679,4218,1969,4888,634,3280,1623,2181,2366,502,8764,8860,11124,435,6317,1012,7051,3588,6317,1012,934,252,5130,934,3695,3523,3558,377,2679,856,5046,934,1491,934,4909 2 8946
+213,2679,201,8,1003,162,130,808,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2181,67,3914,7781,280,22673,278,355,343,4031,533,3700,213,13441,2679,67,6171,2206,1337,3523,3471,213,13441,2679,6423,1716,3523,808,1226,213,13441,2679,2229,3195,2679,2560,1877,3523,2679,1712,2560,3310,5564,1877,21123,2560,213,13441,2679,1770,446,693,1968,2606,2679,213,13441,2679,213,13441,2679,3523,1111,2229,1519,312,2144,4398,213,4745,694,10403,1996,580,2461,31146,3416,213,13441,2679,1770,5189,2606,3523,100,2606,2679,2722,3529,213,13441,2679,2067,312,677,213,13441,2679,1843,2181,5097,3589,2606,3523,1856,6585,213,13441,2679,3642,3529,2679,2679,3529,1337,32225,2229,2974,190,3529,8116,2382,3523,3529,2679,535,41083,4838,1214,1483,3471,48223,3083,1832,6130,672,2488,2793,580,278,355,2229,4218,3083,2679,2119,3281,2679,3529,3523,4398,213,535,4392,580,1754,15463,694,693,580,5236,48223,2119,285,48223,163,6585,5236,1969,2679,3147,6585,2967,580,4392,213,13441,2679,672,8221,3700,213,13441,2679,213,13441,2679,113,2679,3529,413,2781,2679,3529,10403,694,1716,253,2888,15463,2679,3529,6067,2635,2077,1856,10527,2974,107,3013,343,4031,533,2181,67,3914,3782,213,13441,2679,591,3583,3523,2119,138,138,6359,40288,40556,40449,40573,3523,2229,3340,2119,38591,2181,6406,3038,1240,3543,2679,4586,3014,104,3523,907,805,8388,4586,5236,987,1284,2382,1509,5900,469,7051,96430,1754,12236,6704,6530,1754,3583,3583,487,175,1615,5236,2159,26820,575,3714,253,3523,3399,3523,3775,487,175,487,581,2679,2664,4364,2454,2679,1199,67,2679,2755,496,3092,3523,3523,487,20820,40155,3343,778,2369,734,104,252,1240,987,5051,252,6530,1754,854,5236,805,8388,2159,278,355,2229,6171,388,5900,29027,3648,5942,1337,8860,5837,3083,3583,1476,3657,648,435,2679,3529,3027,5942,3885,1226,104,4529,722,4259,6530,1754,764,175,3523,62607,3234,2440,3529,2679,1226,104,2181,67,3914,3700,213,13441,2679,3782,2679,5879,1476,1337,8860,393,3031,32225,3529,2679,32225,2600,3523,3603,253,3038,634,8277,1273,560,591,2029,873,42980,4888,634,7707,487,828,3280,3558,1716,2679,6704,37,1002,3230,380,1936,14669,2181,5236,31145,37,2181,57,4259,2159,42054,10182,2119,3523,13272,2400,2679,3234,3807,5232,3038,2119,7806,2923,1086,1086,1086,4218,4009,295,32225,4610,3616,435,2679,576,435,40831,4084,40206,1376,14241,17632,2606,14089,40206,3457,8379,435,576,8098,1812,217,1789,546,40040,213,1971,32225,2382,1601,6682,694,2679,213,1662,694,213,1183,11198,795,4398,4218,3843,213,4745,5313,213,4745,8129,3147,2781,213,535,648,213,3230,3548,11405,1086,1662,1856,580,16536,252,48223,3529,694 2 8946
+213,2679,201,8,1003,162,130,808,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 269,1335,3304,343,1003,1741,1109,253,3603,343,4031,533,343,136,4031,4144,4357,2211,19361,3734,2322,343,1003,1741,1109,253,3603,343,1003,1741,1109,343,1003,1741,1109,84980,136,1741,278,1109,2725,413,3470,4048,1003,136,11316,3997,12625,805,3531,14016,2382,14016,2382,11316,805,8388,535,1826,1003,136,1354,14016,2382,11316,805,8388,2522,1832,4738,4394,1003,136,107,4224,3204,252,2982,2522,1436,156,1109,4532,2461,2560,1877,11316,805,8388,2725,14016,2382,84980,7150,103,4504,8632,2119,3281,107,377,9,10,107,958,343,136,4031,1109,3661,52,107,1609,3531,397,107,1391,3614,966,2944,3800,1003,136,6947,535,11316,805,2725,14016,2382,107,1003,136,2316,3458,378,462,2099,4498,378,136,4254,1436,9,10,808,1622,3484,7170,1003,136,3808,764,136,87,135,2619,18,4628,3018,2960,103,4504,8632,9,10,827,2560,1003,136,103,1003,136,4048,156,718,1003,966,966,1843,11316,805,4303,3790,7817,15463,30742,2185,14016,2382,4048,15463,30742,9995,2185,2963,17984,3328,456,15463,3898,4738,4968,329,3303,2028,1741,1354,8751,1003,136,3326,7170,84980,1143,2996,2908,3661,52,1109,3807,3303,3614,11316,805,8388,2982,14016,2382,2522,1832,4738,4394,1003,136,11316,805,175,11316,805,3471,32226,805,535,2382,8388,3337,14016,3295,4028,2030,1391,7806,3299,3523,5979,4009,695,695,2181,1662,805,24310,10943,35971,1391,2833,24310,6135,5979,959,2753,1180,8388,1353,2467,1003,11316,805,535,873,3860,873,9,10,11316,805,431,431,3775,535,16308,1003,136,3614,7103,136,6585,2953,873,5363,3529,11316,805,8388,271,4247,1826,1354,1003,136,8632,4504,8632,3686,1877,2908,1109,5979,3024,780,1003,136,1741,559,3686,1003,136,4048,4578,1354,1001,1354,8751,1003,136,2522,206,136,3030,41,2077,574,575,30858,442,2393,4304,722,4872,1049,3782,660,4152,84980,1111,7822,14651,3686,2560,1741,1003,136,2681,107,3586,3295,966,966,1741,805,8388,8632,4504,8632,3204,2793,2316,2793,1003,136,2793,14904,2099,435,31141,31133,1597,8927,1003,136,8388,567,3553,252,252,378,57,5979,3108,4126,2679,2067,1003,2679,5564,6079,3523,1712,596,456,1620,10527,3513,4475,13844,3471,42214,213,14016,5335,3471,48099,1003,2679,3782,3641,3686,677,2679,8847,4177,1003,2755,43,296,30683,3558,2185,1131,2793,4048,14016,2067,3471,103692,13281,2067,1856,1391,2679,17253,567,103692,100,2067,4392,6538,1620,1003,10527,3523,443,10860,14016,10087,764,8098,1003,1072,1597,6519,3834,103,4504,8632,2942,107,3328,1741,1003,136,4048,456,15463,442,4365,11483,3471,81978,5159,1741,3464,2560,4126,2679,2067,4126,2077 1 8946
+213,2679,201,8,1003,162,130,808,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1880,501,1881,1003,10527,2679,8899,11796,501,1881,1003,10527,2679,1856,1256,1003,10527,2679,213,4745,1003,1256,8129,5312,5312,252,20303,672,14406,378,43,1003,17253,1003,213,2679,1211,3529,43,1003,4689,42218,42215,42216,1211,672,378,43,67,2911,535,501,1642,6585,2077,501,784,10429,6656,6653,6585,2077,501,1597,3471,501,1642,2566,377,2911,67,3939,4137,377,265,17665,7366,568,67,3247,3248,3250,533,1388,35,67,1881,8107,1335,274,2794,934,265,5569,5779,3662,1161,343,514,2219,343,4031,533,2176,3930,6140,3158,11065,269,2814,1880,7451,60006,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1 8946
+213,2679,201,8,1003,162,130,808,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1880,501,1881,2679,8899,11796,501,1881,1881,1388,11643,9789,4074,11058,1146,13535,8949,31466,12676,7375,3371,8255,41957,3102,6781,41958,1524,18547,37201,16490,11642,8783,11342,6483,10900,9353,6588,42135,6799,6922,9800,9082,5963,41959,11554,12421,10770,3060,41960,2005,41961,2679,3906,2176,691,330,2109,252,3529,3700,252,252,4539,252,3529,2488,2672,2793,3030,1791,2560,2974,5004,691,330,10527,1256,2109,1623,938,2679,596,456,4533,10527,10843,1108,1211,1111,6656,163,6585,252,3529,1623,938,870,10527,596,3637,113,2679,213,48099,2679,10527,1256,3676,1856,535,6162,213,1662,10527,2679,580,4392,213,3558,1131,10527,2679,213,2679,3529,2382,4218,805,8388,4838,1968,2679,35127,2967,576,2269,5474,10527,1256,3280,3048,2679,1712,456,35127,1968,2679,456,35127,2967,3503,10175,10498,11289,648,6656,3227,435,2119,1256,10527,1256,38708,1770,3616,213,3048,3523,1968,2679,3529,3563,2769,3700,252,1623,938,1476,6656,1068,2159,10460,2755,138,573,32299,4871,31137,2159,31681,4899,30925,591,412,2029,2159,14105,1476,6656,252,4539,1623,938,213,2679,4539,456,5888,5516,377,2679,1968,3048,2679,546,438,2750,3588,535,163,3523,296,780,252,3529,1623,938,2679,3529,1856,2699,10527,1856,3448,10527,113,7055,1772,24979,10527,6474,2679,1519,156,2488,2672,1623,938,2488,10527,2793,3030,1791,1623,938,2793,2679,1791,1754,1856,6400,4207,3495,784,10527,2793,3030,3586,5100,156,136,3558,3305,1843,2560,1623,938,2755,43,2974,5004,1623,938,3027,3014,1970,252,3523,1856,67,3529,3529,2560,2488,2793,3030,907,5335,1812,8903,2679,12503,2679,2679,19272,10464,389,2679,716,11475,2679,716,12604,2679,87,2679,42214,96593,2679,7776,7777,2679,8643,2679,46720,46721,2679,4647,11677,2679,14084,2719,2679,32715,2679,16714,2679,1672,2679,1003,213,2679,1863,1864,2679,92434,2679,217,2679,8653,2679,13297,32227,2679,10799,2679,1968,1003,2679,1968,42213,2679,53270,11475,2679,40185,2679,42213,213,2679,29497,2679,8330,2679,2506,2679,12607,1935,2679,576,11475,2679,88284,213,2679,456,2723,2679,69223,2679,41789,2679,5099,38580,2679,2353,2679,4134,25081,2679,96594,11480,5019,2679,13093,3930,2028,3930,63199,63200,755,5538,14,3532,7012,10045,16904,2067,8588,755,3475,2911,38821,2155,3651,67,2911,535,501,1642,6585,2077,501,784,10429,6656,6653,6585,2077,501,1597,3471,501,1642,2566,377,2911,67,3939,4137,377,265,17665,7366,568,67,3247,3248,3250,533,1388,35,67,1881,8107,1335,274,2794,934,265,5569,5779,3662,1161,343,514,2219,343,4031,533,2176,3930,6140,3158,11065,269,2814,1880,7451,706,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367 1 8946
+213,2679,201,8,1003,162,130,808,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1880,501,1881,1003,213,2679,1211,8899,11796,501,1881,1881,1388,11643,9789,4074,11058,1146,13535,8949,31466,12676,7375,3371,8255,41957,3102,6781,41958,1524,18547,37201,16490,11642,8783,11342,6483,10900,9353,6588,42135,6799,6922,9800,9082,5963,41959,11554,12421,10770,3060,41960,2005,41961,1003,213,2679,1211,3906,2176,7862,691,330,2109,252,3529,3700,252,252,4539,252,3529,2488,2672,2793,3030,1791,2560,2974,5004,7862,1003,1003,10527,2679,691,330,1623,938,1211,1003,213,2679,2109,1623,938,5312,252,20303,672,14406,378,43,1003,17253,252,3529,1623,938,213,2679,1003,10527,1856,4123,213,14016,5335,1003,42214,412,552,213,2679,10527,5312,10527,1256,3230,2974,3962,6317,202,14406,3700,252,1623,938,213,2679,1003,14016,2382,805,8388,14016,42214,3529,41,9962,10616,2679,634,1273,560,3234,3122,3686,2679,21560,13820,678,505,793,1318,591,252,3523,3558,353,1423,4491,3666,6127,889,2018,1409,67,2553,3700,353,3014,1388,10930,353,1423,678,252,3523,591,2358,7162,252,3523,591,1329,7882,252,3523,591,1329,42152,252,3523,591,1329,885,252,3523,591,1329,252,4539,1623,938,1003,213,2679,10616,546,1245,40040,4539,828,4568,5888,296,213,8379,1003,252,3529,1623,938,1003,213,2679,1211,3529,43,1003,4689,42218,42215,42216,42214,42216,44945,1211,672,378,43,2488,2672,1623,938,202,2488,2793,3030,1791,1623,938,2793,3030,3586,848,6349,1844,43,1003,2560,1623,938,2560,43,2755,73329,4177,1003,2974,5004,1623,938,3528,3930,2028,3930,30562,42219,755,2078,156,610,1238,438,873,24074,147,873,1562,749,3475,2911,38821,2155,3651,67,2911,535,501,1642,6585,2077,501,784,10429,6656,6653,6585,2077,501,1597,3471,501,1642,2566,377,2911,67,3939,4137,377,265,17665,7366,568,67,3247,3248,3250,533,1388,35,67,1881,8107,1335,274,2794,934,265,5569,5779,3662,1161,343,514,2219,343,4031,533,2176,3930,6140,3158,11065,269,2814,1880,7451,706,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1 8946
+213,2679,201,8,1003,162,130,808,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1880,501,1881,42213,213,2679,8899,11796,501,1881,1881,1388,11643,9789,4074,11058,1146,13535,8949,31466,12676,7375,3371,8255,41957,3102,6781,41958,1524,18547,37201,16490,11642,8783,11342,6483,10900,9353,6588,42135,6799,6922,9800,9082,5963,41959,11554,12421,10770,3060,41960,2005,41961,42213,213,2679,3906,2176,7862,691,330,2109,252,3529,3700,252,252,4539,252,3529,2488,2672,2793,3030,1791,2560,2974,5004,7862,42213,2679,691,330,1623,938,3048,42213,2679,213,2679,73504,2109,1623,938,73504,4398,10613,649,1003,14016,5335,42213,2679,1712,412,1256,42213,10527,2461,31146,42213,213,2679,4586,546,40040,252,3529,1623,938,252,4586,873,6250,2679,576,2679,377,5068,546,40040,6351,576,42213,10613,1391,25569,213,4745,576,14016,13268,213,6135,3280,10527,1256,3557,438,2310,2679,1256,3280,2679,377,13785,2909,3147,3523,3038,3073,10754,3090,37003,1111,216,50,14016,13268,378,73329,1003,4177,3700,252,1623,938,487,252,4586,2679,14016,2382,3280,634,1273,560,678,505,793,1318,591,252,3523,3558,353,1423,4491,3666,6127,889,2018,1409,67,2553,3700,353,3014,1388,10930,353,1423,678,252,3523,591,2358,7162,252,3523,591,1329,7882,252,3523,591,1329,42152,252,3523,591,1329,885,252,3523,591,1329,252,4539,1623,938,1245,546,40040,4568,42153,4201,13353,2679,213,4745,4539,828,213,8129,4539,21613,13353,252,3529,1623,938,42213,2679,4218,4586,3614,378,3016,42213,53443,3443,1818,1003,2793,42213,10613,3834,156,1519,42213,2679,17470,136,2488,2672,1623,938,42213,10527,3565,2488,3303,31141,43,32312,2793,3030,1791,1623,938,2793,3030,3677,136,17470,6349,156,1844,156,20705,156,31219,12378,156,3553,1597,252,3529,2344,42213,15463,3947,1003,136,2560,1623,938,10882,4738,213,26958,5335,1003,2270,8847,4177,1003,4218,3714,4738,1975,487,203,2974,5004,1623,938,3048,42213,2679,4174,846,6585,2606,2679,73504,567,1843,3930,2028,3930,999,13531,755,14017,3770,2366,2219,106,1018,501,355,1486,1726,3475,2911,38821,2155,3651,67,2911,535,501,1642,6585,2077,501,784,10429,6656,6653,6585,2077,501,1597,3471,501,1642,2566,377,2911,67,3939,4137,377,265,17665,7366,568,67,3247,3248,3250,533,1388,35,67,1881,8107,1335,274,2794,934,265,5569,5779,3662,1161,343,514,2219,343,4031,533,2176,3930,6140,3158,11065,269,2814,1880,7451,706,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1 8946
diff --git a/models/match/match-pyramid/data/train/train.txt b/models/match/match-pyramid/data/train/train.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3f980cde9b2789ad8d3a32d433ba50cc337be779
--- /dev/null
+++ b/models/match/match-pyramid/data/train/train.txt
@@ -0,0 +1,128 @@
+1985,8,1611,81,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 343,1045,26584,81,7566,1018,271,1306,295,1611,81,4183,3158,10809,3128,2814,4025,81,662,1726,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+46,103,1611,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1611,4998,2247,4036,2012,452,3853,760,579,1055,373,257,1654,4740,3348,7310,3304,4357,1611,4998,2247,4036,2012,452,3853,1611,4998,2247,2322,3742,4143,2558,3926,1087,334,1006,3926,2753,5248,343,434,2012,452,2953,2454,4357,103,46,858,3453,9039,271,2012,452,3853,3304,103,46,858,3013,1006,3926,3926,1087,334,858,2959,6465,10,1196,528,103,46,858,3897,2168,20248,46,9,10,1329,2913,3448,2549,67,1087,2171,1552,120,2584,46,6077,1087,2171,253,3653,415,253,4254,1720,6610,3784,1676,3115,3926,1087,334,4357,103,46,858,415,253,6067,6320,1716,2012,452,9,10,253,3897,3926,1087,334,1006,3926,5974,1982,343,1228,452,1668,3126,940,2020,7175,2911,3033,6314,2927,6127,397,2012,1014,253,3897,434,259,6100,2012,452,3931,2012,1014,6501,940,2012,113,1014,2996,4304,2012,253,3897,672,5871,2012,3546,163,4610,2012,2012,452,3853,2316,7177,434,2012,420,3557,9,10,1029,34928,2141,1611,4998,2247,7177,905,660,3330,1668,3126,1228,940,6643,1982,5763,438,287,67,5494,2012,452,1111,535,67,3829,259,3603,373,3471,452,103,856,3443,2012,452,3853,4357,3287,1329,2794,3236,103,46,858,535,434,2012,452,1014,23238,2898,858,3013,858,3897,4303,3445,3494,104,660,3557,103,46,858,4357,415,808,2968,6608,6354,420,2987,229,4490,1141,373,257,1654,3471,259,163,11290,5513,1827,413,1329,7170,452,1228,705,539,2753,1611,4998,2247,2322,579,1055,5998,259,1211,452,1740,5279,163,4610,259,3603,3471,452,1795,373,1654,3471,259,2119,3043,4357,452,4997,3497,3453,5513,763,67,1611,4998,2247,1611,4998,2247,2012,3651,3158,34932,2814,3471,1611,2247,1623,706,3215,3158,11806,2814,1335,3304,760,3836,4740,3348,3158,11806,2814,1335,3304,4740,760,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+343,165,452,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2215,1335,834,1280,2215,1335,2215,934,2176,1611,165,452,1329,3581,7170,437,664,2215,343,165,452,3742,1956,1329,2994,1796,21648,480,165,711,1631,9,10,1216,11290,20035,4384,1173,2440,165,2162,4849,1329,259,165,452,7710,330,2029,5322,5388,827,9106,5391,320,3280,20035,47539,1796,1048,2215,1180,1391,3841,1048,6820,4902,165,452,1354,1329,373,35685,280,634,1047,3692,2232,3483,729,540,3453,343,165,452,2987,35635,11301,165,9306,3280,9,10,2967,4347,2851,500,595,452,3923,165,1216,3563,540,393,4678,425,426,186,40,6334,5874,2190,2088,20035,490,535,163,165,1796,1354,285,165,349,1131,2923,2952,435,4124,165,3926,3043,393,4636,413,4527,4902,15788,2635,2162,20035,452,165,3926,1796,24271,63460,1127,1148,3567,24271,165,773,3343,1127,1148,413,1329,2987,297,1555,165,9306,2152,2479,6235,1981,165,3926,4850,1676,5483,5385,6,4636,856,717,165,1796,1676,3147,165,1796,4850,535,12406,870,2325,165,9306,35468,4108,434,26,3600,5883,2022,4134,4250,2987,3635,1125,7538,165,3926,3146,3234,935,4859,1228,5502,373,1568,1195,2405,165,3926,393,5502,4428,3742,4627,402,3743,165,3926,271,3033,5511,3295,4782,543,4036,3651,165,5705,543,535,3742,330,165,3926,2029,343,165,452,1216,6076,5502,393,7166,2753,343,140,13998,3451,5546,3147,3742,343,165,452,1676,1796,717,165,287,4859,642,529,1813,1796,1752,343,165,452,1676,5564,442,4085,7023,165,480,29623,165,711,1631,1796,480,9,10,5263,10276,7462,140,435,3581,442,437,3329,343,2347,29623,343,7068,3281,4152,320,660,1351,1148,50,660,8616,4453,4303,165,543,1179,4453,4303,660,21463,642,9306,2325,3521,1008,29623,5152,1116,25021,5694,535,12406,959,2467,827,1139,7461,1008,2958,660,5385,1796,480,1116,1228,2012,3329,165,452,2579,5960,4347,2549,165,660,3043,2162,1631,403,186,40,529,1796,355,3117,343,355,5391,21690,343,165,452,3261,3123,297,3449,3581,442,437,1611,3278,1043,377,4455,343,165,452,16,343,165,452,1249,975,3014,343,165,452,1043,377,2968,3787,802,165,67,103,802,5131,21648,480,26,9,10,2215,1631,95,355,802,5385,343,1796,3477,2310,285,3037,802,165,1526,1973,1641,385,1268,2630,2022,5048,4647,26,81,585,4241,1597,9,10,2215,165,2176,4241,1179,1180,165,81,2215,343,165,452,2322,1631,711,165,452,2215,343,165,452,50510,95,355,8336,7136,1956,165,2215,3090,1796,3930,802,5385,2215,165,643,3962,2211,1029,16821,2215,343,165,452,3158,86487,2215,2814,1280,3729,3213,193367,193367,193367
+1092,229,1093,975,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 40240,975,58085,1093,58085,1093,4470,6802,9687,980,3187,3696,308,229,494,393,74584,58085,3175,5569,67,3249,3158,47302,229,58083,40240,58084,975,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+1621,2002,156,378,578,2003,1008,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2002,156,2470,3525,533,1388,4113,3933,2002,156,2002,156,20570,156,206,2002,156,722,156,2077,156,3782,156,980,14175,20570,156,5099,156,2002,156,2002,156,113,20570,156,2003,1008,3829,5099,1935,378,46760,1014,5099,1935,3471,7367,890,31021,5099,1935,1111,1264,809,10452,809,693,535,394,3829,2270,5099,1688,693,2975,827,889,5099,1688,378,3644,574,575,6987,2050,156,6519,794,147,1423,5344,764,20570,156,20570,156,349,693,2003,1008,30687,1660,2269,580,10527,3897,3581,20570,156,349,147,2316,3458,31045,1329,206,2002,156,2316,3834,206,2002,156,5099,3829,18114,2620,604,203,414,2396,7061,1730,50489,3416,33183,2458,12537,7000,752,2029,5408,30894,382,5934,1072,5442,1162,1976,2002,156,6501,46760,475,31141,4384,10663,10527,4384,46743,13831,4384,2181,2992,48005,4194,13156,576,8603,3471,157117,109806,576,784,4218,25327,206,156,349,4812,13519,8930,501,986,147,2002,156,12086,206,722,156,4247,17969,722,2002,156,361,2229,2229,3529,6974,487,252,3807,2600,693,3235,1620,5099,1688,2077,156,2077,2002,156,2159,34,2159,294,1620,5099,1688,2270,693,3512,2488,889,2067,3043,5099,1935,4392,2316,1843,764,2067,2002,156,2992,2998,5099,37010,2119,5099,2294,1688,5829,7170,3693,14145,14145,5037,5099,580,54,5099,1935,2522,1688,889,2067,784,4218,3174,37010,567,2159,5829,2181,442,6585,2967,2077,3516,1623,533,2366,2388,1752,163,4872,5099,889,2488,7199,3782,156,980,14175,980,14175,2002,156,3108,3015,677,2358,10384,829,1730,2560,30873,2313,1843,1436,2002,156,5811,1730,1072,809,3108,1072,677,67,1826,67,2002,156,2211,343,147,533,67,355,3014,940,5099,355,1501,44306,264,1141,3215,78963,528,6652,1078,5099,5099,1362,259,1501,264,1141,3215,3158,12864,2117,5099,3071,1501,264,1141,3215,3158,5099,3071,2117,1754,3247,1321,780,265,4389,1516,14103,7366,4976,2322,147,533,393,533,1079,452,1271,867,7510,295,1321,459,3914,2028,6140,934,2211,377,459,5569,3522,5568,21367,5779,2211,46886,3471,2092,46886,452,393,533,1079,452,2322,147,533,3158,2814,1321,2002,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+2139,732,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2476,6278,253,1795,50,1494,5361,2578,732,2753,4851,271,4947,5699,6038,1955,1238,271,1306,8138,832,7566,5320,2162,2681,2942,2211,4740,3954,2470,2476,934,2476,271,4947,1388,1228,253,5361,1494,2476,6278,934,459,1388,1335,5593,346,2794,902,31,280,958,1960,253,1228,50,1494,5361,2578,732,2753,295,50,2578,4201,4583,5361,11815,1391,8940,50,4046,2578,2320,1284,3765,3004,7369,13954,10622,2731,4182,13978,20,20334,3758,6418,1950,2578,2320,7369,378,3015,533,986,4529,505,2065,147,764,12516,30870,4046,6339,136,378,437,3589,462,2320,2545,2946,435,2320,2578,4201,100,8637,50,1494,299,3281,71,1216,3280,1734,434,2522,50,1494,2578,4201,4583,378,7426,4265,2578,14038,4583,535,546,50,441,3882,21926,889,4265,2137,5824,2578,4201,4583,271,3169,1827,10,50,4046,2729,3531,191,223,2578,4201,4583,3531,4600,2476,343,2578,732,2729,3531,2476,2992,191,388,6258,2339,436,2578,188,2476,299,3588,589,780,5056,2578,732,5361,4745,50,5218,52,2577,10534,4688,299,589,1804,1853,53943,5464,732,1968,5361,2578,732,2270,2922,2316,2009,2578,4201,4583,103,2968,3031,3608,2009,2476,2729,3531,2522,1950,5361,2578,732,3322,3562,1803,1330,2578,4201,4583,271,2969,2476,4755,2578,732,730,2139,62544,633,9386,1008,2009,732,2139,62544,3445,7289,4201,20334,3758,20,2603,732,4991,2139,21074,7807,3686,802,271,732,535,26822,6097,4100,9736,3790,6097,50,3445,4100,7289,2969,732,535,2578,2270,1620,2396,4085,3819,2522,1950,50,441,898,4201,2578,2522,1620,42594,4066,14331,732,4991,42594,945,30527,14281,31583,2578,20,560,14331,5335,42594,2753,3147,174,898,14331,578,42594,4066,2522,8316,14331,717,2579,4247,3563,2578,4201,4583,794,7289,3567,1620,1494,42594,2753,76611,717,2254,1494,456,2252,717,3628,4290,4201,717,535,2578,8126,4288,1827,3544,1795,3768,535,456,4764,4304,10442,4583,163,4872,2769,124532,50,9347,12677,2578,163,4872,2320,2753,5361,2578,732,3284,11858,2578,732,5361,2893,730,3284,3944,692,4953,1314,34074,732,13914,76623,3823,5034,4046,934,14331,3265,9990,8293,603,898,602,6332,3377,3265,3377,1111,21372,50,4046,2969,2865,4270,4459,4608,4588,312,2578,49213,828,312,2578,1754,5152,4122,5472,533,216,986,10390,3529,357,14331,12913,603,3663,2211,253,2211,546,1986,554,393,229,394,2322,229,3701,1216,2578,4201,299,589,435,2211,1917,17363,2476,271,4947,1917,17363,2476,271,4947,50,3236,17363,1917,2476,2814,4254,1043,377,271,4947,229,3701,1216,2731,4182,4100,4583,13923,50,1494,2476,20629,13923,50,1494,15429,3603,3701,253,271
+2049,2050,468,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2864,3696,3279,3632,1524,3039,19342,2814,4654,2934,729,29,2485,2691,2769,3050,1018,3222,6277,425,426,2977,3536,19342,620,7001,1567,1161,1254,3962,13102,729,2864,3696,3279,3632,109353,7510,1775,5232,5313,3310,3536,2863,29,2485,2691,2176,29,3307,109353,343,2485,2886,764,3559,1103,2050,468,266,267,2316,1483,2030,20937,1381,456,25649,15680,817,2992,4356,10299,1329,2579,7209,10378,1483,6429,3039,33,146,2316,457,4451,457,264,109353,7840,1694,1483,5802,3493,299,794,457,4817,287,5073,3536,5366,1159,3195,2701,3536,2719,2883,2886,39812,343,3062,9456,116285,10176,3809,18107,3249,535,1524,3039,567,7461,7056,5899,1703,2009,299,271,4303,109353,5275,3834,3835,3515,19342,412,6131,2467,299,4794,1254,3962,2009,299,4740,6662,3962,299,869,2889,30888,1329,1431,3663,3512,1254,4794,10121,271,1264,299,3328,19342,357,5345,21926,264,4794,2927,2009,299,4740,6662,3962,1409,1388,3195,5073,3857,3809,18107,3249,535,1524,3039,870,567,5994,535,19751,3839,3897,2114,8777,113,299,3759,37,5502,100,6320,960,466,7470,19342,2701,2864,960,299,3329,67,382,5769,202,8623,2701,19342,535,869,3613,1735,252,271,1161,4813,19342,2722,43541,14115,4303,589,1567,3897,3742,4402,3458,8043,1833,299,20324,2864,1484,944,5934,2029,264,4303,109353,5275,1111,19342,1676,3258,1950,2050,468,266,267,2864,3786,2691,3471,67,5070,3756,3027,3471,253,567,3553,67,3038,1694,109353,19342,3039,1970,2408,5073,3334,13723,36740,95120,3441,2141,109353,3223,3224,34383,91,755,1142,3207,1524,3039,1141,51254,51255,3353,3158,19342,2814,52158,5382,3536,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+1452,229,91,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3703,415,53918,6167,1652,3486,3486,3840,1484,12001,2466,1055,1652,3486,152,332,1055,1652,3486,4381,2866,3511,21118,1141,21118,15687,438,229,553,75063,3294,3623,557,558,3504,623,438,958,2942,1141,21118,1746,2960,2866,3511,3216,438,229,553,75063,535,671,2523,3511,2018,3554,3034,11643,5206,3857,3554,3034,4761,5862,3623,557,558,3504,623,121370,438,958,3834,15,3537,75063,3554,1055,1652,3486,4381,20806,3584,2109,75063,581,121370,553,1798,75063,3589,2192,1168,3447,1960,3169,958,2405,2635,1620,3819,438,958,6396,271,2866,1960,3169,958,491,2960,271,491,961,3556,271,2523,1407,971,64770,2405,5009,21599,37189,2960,2960,2960,3703,11344,491,438,71,1079,452,2273,2794,1960,1039,1960,2292,2960,2960,2960,2960,2960,2960,3703,415,491,958,971,2960,1055,1652,3486,152,5962,415,1652,3486,4381,3486,2866,375,2113,2295,1055,1746,2866,3511,1803,2523,1407,971,93014,1528,4590,311,971,6095,2109,438,229,553,2960,2960,2960,271,971,1676,4486,1652,3169,3354,1528,2523,1407,271,971,1528,2523,1407,271,2523,1407,971,1676,2960,2960,2960,415,7134,5962,11344,491,971,3332,4486,3169,958,415,491,971,11344,491,7187,435,438,71,1079,452,2273,2794,1960,1039,1960,64770,2292,2960,3295,2960,2960,2960,2960,2960,2960,2960,2960,2960,2960,3419,2960,2960,2960,2960,2960,2960,2960,2960,2960,2960,2960,2960,37189,2960,2960,958,2405,5820,93014,1803,6736,971,3511,93014,1803,22898,1668,4486,11344,93014,1803,6736,971,415,93014,64770,438,958,64770,16082,5820,971,4486,3169,958,3295,3295,2960,2960,2960,2960,2960,2960,2960,1055,1652,3486,152,1652,3486,415,271,7134,2113,3703,229,971,2292,1662,2295,3419,229,971,2292,1055,3703,229,971,491,71,2579,1078,1228,2485,3784,2951,1228,452,3771,223,1228,3784,15630,987,711,154,5033,596,961,223,546,1228,491,49825,15,1196,1253,2493,4950,24455,7068,2951,2292,2322,3501,929,3486,1008,3519,171,2648,7068,491,5144,2292,393,438,3451,47606,965,1312,1652,5895,298,171,2648,7068,491,1524,171,2648,7068,491,2292,402,393,42269,5467,355,171,2648,7068,491,2292,393,469,528,529,5005,6971,2161,127,10869,4663,371,2292,2292,6600,6600,6600,6600,6600,6600,6600,6600,6600,6600,6600,6600,6600,6600,6600,6600,6600,6600,1652,3486,415,271,7134,2113,3703,229,971,2292,1662,2295,3419,229,971,2292,1055,3703,229,971,491,425,229,926,1645,1232,5312,3897,6786,1232,5312,3897,171,2648,7068,491,2292,2292,71,2579,1079,452,393,931,533,452,2929,229,873,4064,321,4392,35915,2948,4281,1228,3002,3771,171,2648,7068,491,2292,393
+336,46,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 336,371,46,3018,46,2029,2922,2922,1006,46,3018,371,3371,760,159,336,371,46,3018,46,2029,2922,2922,371,229,2922,46,2922,46,229,5890,2922,46,2922,46,229,5890,6426,46,2029,6426,46,2029,229,5890,966,46,2029,966,46,2029,229,5890,336,2240,336,1564,336,2866,336,24672,336,1540,336,3926,336,9638,336,13742,336,24015,336,20484,336,5120,336,583,336,15340,336,1373,336,4808,336,2768,336,7226,336,11771,336,24467,336,6567,29995,336,2272,336,57205,336,9815,336,8448,336,59510,336,2538,336,2044,336,1568,336,24375,336,25461,336,9210,336,28330,336,1565,336,9216,336,24952,336,3385,336,7640,336,17272,336,6845,336,3295,2469,336,1472,336,3419,3295,615,336,7957,67351,336,1988,336,31440,336,67361,336,12170,336,3295,1608,336,3419,3419,839,336,1560,29049,336,3295,5014,336,6904,336,24676,336,18286,336,7950,336,27469,336,20486,336,13647,336,108227,336,1366,336,3419,7860,336,862,336,4663,336,82229,336,24661,336,6835,336,7246,336,754,336,9663,336,99360,336,9861,336,20483,336,6832,336,62662,336,10454,336,18472,336,28152,336,26534,336,28455,336,7254,336,2465,832,336,141,6060,336,10585,336,3419,3419,65009,336,36481,336,2472,336,15329,336,6824,336,7430,336,50586,336,4490,336,28526,336,15394,336,7781,336,425,336,350,336,579,336,23093,336,336,22650,336,7135,336,53689,336,3216,46,2029,2168,2922,2922,104,734,3528,10054,2168,3849,5730,3849,3967,2109,2991,9431,6424,3954,2817,5286,8925,13893,5286,620,34120,3341,2672,34098,1790,1048,5286,3328,1271,695,3371,336,371,46,3018,46,2029,2922,2922,867,46,610,1006,3926,3304,2028,2046,2719,3870,253,46,610,6522,67,1214,15680,1006,2814,1142,867,1006,3926,46,610,602,7606,55106,3542,2046,764,3018,1814,23870,1111,1006,3334,2470,101,4673,660,5511,21367,441,5569,3522,2211,934,30425,1006,2814,30426,660,371,695,3371,3371,14753,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+1857,703,1858,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 8292,5038,299,1082,1857,7288,14157,8198,11355,13954,5218,35603,8292,5038,299,1082,1857,7288,14157,8198,11355,13954,5218,5584,6944,185,6841,4477,8116,5962,27130,535,2273,5038,6103,14157,3516,10722,12407,3030,1039,1857,7288,10722,3983,184,1857,1858,14157,1082,2138,2888,10459,10722,2029,3030,5038,3662,1857,4108,14157,31290,649,1354,1833,3662,46,3923,14549,321,13095,578,827,889,13954,2644,19211,2077,4222,10722,184,1857,3030,3204,13710,5218,3999,2635,1064,19211,184,1857,2077,578,1039,1857,31290,3759,3303,13710,13954,6649,2998,889,10800,1857,844,7102,1837,2944,578,1857,31290,3550,3328,5038,3662,827,1082,1857,649,3329,1455,7289,827,1857,14157,3964,3276,13710,1082,8202,578,1857,14157,31290,12395,3511,163,1039,1857,5373,1455,3276,692,3548,759,5564,1857,1858,175,2254,18511,672,3245,10722,3614,1837,14157,3933,14157,19298,15566,2145,1082,6869,441,10452,299,27696,35598,1858,13962,19229,11538,5392,10800,2211,14157,13954,148084,351,4708,370,141,17538,370,3207,2296,14593,6652,311,2028,35603,9,10,393,4636,4636,397,452,3930,3158,12907,3128,2814,35610,35603,660,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+1183,164,373,1184,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3888,10055,3607,1184,3888,10055,3607,1184,4627,2934,738,2113,16891,1184,10639,4384,2140,1042,1374,4874,3310,1227,14529,6502,2188,5560,1184,3310,2719,373,17223,2044,4852,3607,1712,373,2140,2141,257,1654,343,154,4731,8051,91629,1227,14529,2967,2968,6191,1654,4402,2044,3825,1654,3031,1184,3195,3063,1567,5900,3556,14529,3276,1227,1748,4216,91629,4402,14529,5236,31684,5811,2701,3227,343,1227,851,1227,1228,482,6260,5070,10338,3030,3705,2044,1654,3031,1184,3195,7841,7348,6676,1227,2701,3492,5900,5560,3014,5560,1184,2911,10055,1227,14529,343,1227,851,373,5801,31684,2466,6242,6073,47597,2254,14529,3252,373,778,1654,2211,1184,5900,2935,413,4727,2922,2412,1018,1184,4817,2935,4769,2113,3456,2935,2141,8277,1184,373,3038,10110,14529,3556,1654,3790,1184,482,1216,851,7673,31684,343,1227,4477,18296,3216,3547,851,3339,3700,14529,3556,9998,738,3684,4769,1893,1184,3567,3586,506,4729,3607,3516,3334,7837,79,223,3874,1676,4040,16025,60724,2211,3703,3024,14529,285,1430,2935,3110,3607,7348,2408,14529,18296,3638,10099,403,8900,1720,4941,3337,186,1227,1184,4568,1143,103,2951,15268,1734,1227,1754,3914,1179,2423,18296,773,2113,3038,1761,253,1720,2408,113266,6945,1216,9483,295,4883,5560,2935,31684,1018,1184,365,2943,373,31684,1654,3096,4568,373,2044,3330,31,6481,5978,2322,21035,2140,14529,1184,1566,1581,4006,1956,25622,3014,2935,1654,1018,1184,4279,55216,3024,3544,1012,14529,5879,4769,5560,3287,6228,6697,2113,3533,3786,5609,8277,2722,7404,1086,2987,24948,6191,373,3038,21084,5900,1799,29009,104,5041,6242,1184,4690,795,14529,9998,3274,163,8879,8140,23550,1049,373,2044,5457,2987,3192,1374,4837,1184,2865,722,3477,86399,14529,104,3876,4627,2922,3031,1184,9998,1216,851,3555,4257,2140,2141,10422,535,89185,1253,479,9,10,9998,5351,37856,28685,10339,89185,2579,1921,28262,60535,738,1033,9998,8277,1216,28790,89185,1253,3229,535,5351,21369,28685,2400,21741,692,2968,3509,28262,60535,52,5688,10339,2579,20829,1012,3555,3291,165,3509,7283,17359,1008,697,1033,9998,1216,1042,5160,1111,402,1501,3471,3030,7348,1654,2188,479,425,426,3258,22748,500,28262,1607,1929,738,1607,1929,4279,2141,2405,500,7468,1776,3787,1475,6748,186,9998,1216,28790,10422,23416,31684,14442,6144,2967,4899,6748,186,3471,3677,3805,6748,186,6748,186,6748,1743,1351,6086,9998,856,1001,361,18296,1184,3734,729,25355,9056,3099,6958,3734,673,2141,361,4605,3921,5812,52825,1716,14529,9056,20874,2140,2113,2722,4322,412,2616,5588,1216,14529,3764,1143,2861,9998,17658,1335,808,1776,17039,12086,361,11213,3734,8277,104,3281,2141,17039,1654,4202,4568,2861
+162,169,2266,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 4107,321,4107,321,321,1228,8918,1983,3834,2266,56037,54242,26790,138084,138007,2266,2206,112002,9383,1552,164887,186,2580,17953,2576,6791,9988,3229,6791,4547,3588,10966,55981,3655,12653,579,2458,42557,10648,4547,6621,175047,3337,610,2927,1344,4547,96621,3043,42535,54855,39013,31004,579,1235,1235,2046,2934,4234,3216,3834,2266,2580,29459,9803,29459,5251,5251,42364,15386,2576,1235,1265,4406,2266,1970,4365,4374,229,8918,867,103020,30481,42358,154585,60518,3666,555,13907,11278,68599,68608,48509,1623,3906,555,212,27304,42486,39488,1145,15386,1693,397,355,934,377,81,785,2794,1111,5796,27664,14637,27665,2814,2023,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+1590,711,1023,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 29,3307,6923,4116,3189,1567,299,14367,186,2322,1141,555,1142,3950,13370,67,555,3542,1199,3556,3523,9160,646,8304,2188,285,620,1430,3705,8206,6120,620,375,554,5969,42431,185356,185355,1599,1081,65815,82209,7937,65815,82203,55966,42402,82204,33898,82203,82203,82205,42402,82206,82210,82203,82203,82205,42402,82207,3436,8587,233,82203,82203,82208,16473,82203,390,240,241,3393,214,26996,9998,3240,233,1269,5474,35445,1330,18019,16697,29176,35543,16697,4627,35210,4627,17435,1423,1596,3623,3975,1720,560,1145,2929,3905,3393,548,6315,233,3436,8587,233,5098,1269,3436,3437,233,1145,1969,35918,1720,2231,1596,4851,3393,3751,10565,6413,3566,23757,1567,46,42431,185356,2888,349,456,15197,28735,65815,82209,1755,15340,4869,84578,435,26584,20101,82203,349,1340,18541,2465,28735,1409,55914,2580,82203,82208,82203,55966,42402,82204,349,8343,28735,4869,3946,35418,33898,1340,2929,1969,5098,1269,3436,8587,233,82203,82205,42402,82206,5081,294,4418,1340,4437,226,17953,5872,82203,82205,42402,82207,1755,2465,28735,560,1409,29176,18330,1340,52602,75383,2273,6103,660,2927,52450,2316,100,4406,113,2050,321,349,3537,4999,15435,1228,214,1391,687,203,4406,7106,10677,2273,5412,320,3030,2951,717,12585,1014,1786,4151,4314,113,12463,4636,3532,22529,42431,185356,475,408,4406,3081,175809,127055,88266,393,4470,1594,1693,452,13730,3043,23567,2001,4365,1693,321,3699,2001,1552,413,321,4365,1552,3118,321,1596,214,1594,1693,452,4470,3547,1833,1567,1216,5962,1594,1693,452,452,3614,2001,1552,42431,185356,185355,1599,1081,65815,82209,7937,65815,4365,1552,82203,55966,42402,82204,33898,82203,82203,82205,42402,82206,82210,82203,82203,82205,42402,82207,3436,8587,233,82203,82203,82208,16473,82203,23757,349,26584,408,5121,3422,13794,4406,233,4391,240,241,3393,214,3544,321,4365,3014,2545,2951,8630,1014,10677,717,6169,717,12585,1014,4237,4406,7106,11398,5913,4721,14339,321,4365,14011,349,5593,10265,456,3862,46,2185,1567,2906,751,5777,5449,2911,2001,4374,1990,1990,321,2889,2028,664,1141,2454,620,1567,2968,10390,5488,2488,457,1012,14367,186,2322,1594,1693,452,14619,340,3217,14367,214,67,2211,7836,24868,2936,186,2602,1773,54343,1773,2050,111444,54359,93063,1234,82203,55966,42402,82204,6474,349,21458,3081,5121,3422,13794,20216,4406,2050,7468,3422,14632,59315,59316,59316,14632,175829,2316,5121,3422,13794,82203,82208,349,3081,32434,29340,5121,26918,54642,127055,4543,27300,26947,168884,2126,3422,3229,26927,68752,4756,26927,82203,82208,475,2050,54642,33898,27300,82203,175804,42402,175804,82203,2049,21365,11772,4374,475,82203,82208,5121,3422,13794,4406,33898,233,26584,4406,65815,82209,349,4059,3081,3790,1330,539,13907,2576,23096
+1548,873,1589,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2899,141,6573,452,2881,393,1548,1549,652,533,2366,3651,1548,6956,452,3651,3844,3695,3217,34392,1270,2241,21771,755,47209,3651,2141,3215,3158,699,2814,3906,1367,3651,2141,3651,3449,6254,2228,2181,3023,3037,1522,32364,152,343,2611,3451,51279,2269,1480,1548,1877,3451,44778,1043,1141,1228,2927,7051,6225,59488,962,6225,1551,1142,274,59488,962,6225,1551,1589,699,3440,1589,699,1142,274,699,1270,533,2366,1008,3440,699,1270,533,2366,1008,1142,274,425,426,699,3440,425,426,699,1142,274,3458,3038,253,148,5279,459,699,652,533,2366,3651,3453,6140,2881,1548,4355,2203,6783,435,3118,10,3337,229,1270,3623,1130,14659,1130,98523,1196,528,3651,699,501,355,1589,2175,425,426,699,1270,533,2366,1008,2241,21771,755,47209,3651,2141,3480,8588,1607,5652,6832,2025,699,501,355,2942,2899,873,3651,1228,2927,7051,6225,59488,9439,699,27861,699,1295,273,699,2104,755,11271,4708,755,11771,755,1136,34387,755,34591,755,5751,11627,755,19331,755,27935,273,755,1568,2175,15442,2175,425,426,3651,1228,2927,7051,6225,1228,5939,533,2366,3771,9510,699,163,2366,5779,435,1548,1859,4387,435,533,2366,452,2968,7051,6225,3330,1548,5072,2366,3947,2366,2388,793,1108,438,7051,501,2366,7132,1741,6640,533,1960,452,324,1730,533,2366,3616,2648,962,6225,223,501,355,535,962,6225,2312,3882,1548,3166,2946,1228,3110,533,2366,469,452,5487,2366,3035,273,2946,371,1129,1130,1596,1270,808,5480,1548,535,452,3166,2945,3771,3018,1548,46,452,435,3482,452,1548,1214,46891,4245,2994,441,278,2366,1548,7091,7051,3663,5270,3230,7051,3947,2366,3554,2890,1214,46891,2310,278,223,343,3828,1548,533,37096,37097,699,278,223,7885,6686,495,5234,223,533,2366,737,223,934,2927,3947,2366,223,223,2881,2467,343,1548,533,2366,1008,2162,5513,4375,5226,1548,699,652,533,2366,3651,3554,2994,2899,2638,452,2881,699,652,1548,6956,452,3651,533,3272,1008,2927,3947,2366,2467,1548,2181,759,1720,827,441,24860,2077,3449,3651,856,1264,2784,533,2366,2975,2181,2948,5975,4887,7164,9074,452,2968,46891,5610,3106,464,5993,5549,4752,5506,6956,3272,1008,652,3651,4245,1960,397,1877,1548,2206,1228,2994,2701,393,668,571,1642,3449,699,652,533,2366,3651,3452,2030,3202,3272,1008,7188,5012,5506,1483,3771,175,3628,2996,15413,2701,3651,2672,3449,856,3616,2440,2366,1548,2316,1477,2889,5551,3686,4752,2794,940,3654,7366,464,3024,441,1960,190,3329,103,6281,2992,271,6130,3814,2029,163,7646,533,2366,1008,2672,648,5338,3547,3705,7561,175,2998,2908,13178,6344,6956,533
+165,1402,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 717,165,1402,108869,717,165,1402,343,165,452,6845,1806,14659,24824,3388,717,165,1402,15820,6148,371,717,165,1402,79669,11706,1618,28489,1988,33598,16821,79668,79670,9663,6832,16588,3565,3898,3600,5883,5328,966,4735,2022,6284,2935,6092,4187,1026,480,456,4738,4187,1026,6092,4727,15820,1597,4536,1796,3930,3583,3027,9239,3227,1042,717,1713,186,3930,10754,3158,28226,2215,2814,66126,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+206,207,208,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1330,35,271,535,271,397,3204,3834,871,294,35,2522,207,208,206,1106,343,4031,10457,496,9314,5779,3954,490,2438,2162,4498,2901,13133,397,496,2438,7608,1008,3734,3304,103,1887,5593,8304,10683,3216,1335,3618,103,1887,834,5593,3040,1887,1581,561,10683,2470,10683,1111,2211,5569,10683,3043,343,4031,533,1330,35,271,535,271,397,3204,3834,871,294,35,2522,207,208,206,1106,4118,3189,3840,271,107,3204,6072,10182,871,294,35,4160,2522,206,207,208,1106,3030,107,3328,40391,6474,535,216,1072,1660,9314,3686,271,2077,20570,496,1043,2176,4489,4280,2296,5786,5229,271,107,3204,6072,10182,871,294,35,4160,2522,206,207,208,1106,3030,107,3328,40391,6474,535,216,1072,1660,9314,3686,271,2077,20570,496,107,958,3043,343,4031,10457,496,9314,10683,3565,4016,1676,1716,17394,3030,7445,40391,3512,2003,1008,1837,1563,2467,207,208,3090,2472,186452,755,5538,2936,5225,10457,106,214,548,953,482,5584,107,107,297,1706,40392,2427,330,40163,5236,2522,31141,1065,7608,1008,1784,2949,14429,1106,156,2945,6420,21217,2003,496,3489,2960,764,5495,35,4199,2889,1079,1109,40391,3280,797,560,3330,3150,691,10115,2009,124,103,311,2077,5236,1245,3015,574,575,14533,2889,741,186452,3090,4304,722,40391,175,2522,206,1079,722,26978,5236,4259,3090,741,186452,2560,40391,378,1672,443,456,966,2181,3123,456,2560,3015,217,443,2393,3759,2992,693,2003,580,2939,3471,1111,580,1660,13511,23738,14172,31345,4391,10799,580,443,13511,8098,10607,2438,11370,1393,3174,6570,580,5994,7646,793,1737,206,89,6254,986,1789,6570,4468,14429,103,2077,2369,156,2077,4692,8661,40392,3565,1111,693,2270,5656,15587,4032,31141,2828,703,890,15587,397,3090,3666,107,252,1820,56685,575,3328,35,535,312,10461,156,1543,3311,2408,1734,271,535,40391,741,186452,3090,40391,4589,6214,3547,103,2077,3807,175,18990,2077,6408,1001,156,40391,535,311,2077,40047,10123,2059,312,1354,31137,1001,156,5545,1309,2987,1001,741,186452,3090,35,41607,311,312,206,4254,2987,1001,10607,203,3090,8921,3550,2701,3030,252,1820,107,1079,487,1256,2863,6140,1676,10457,2725,3645,2310,40391,35,2059,10123,1857,2522,31141,1079,10527,1256,741,186452,3090,413,107,535,4589,870,3644,2725,6087,3204,4871,31137,2635,40391,107,271,11344,2461,40391,1111,2181,1354,1001,20570,156,3090,741,186452,6330,278,1109,3030,589,7445,5375,2181,397,3090,3825,252,3645,40392,2181,1354,1001,18753,8987,2877,6823,128647,6728,33841,6860,30331,6044,6781,45481,6758,85967,186452,9007,43249,19906,19229,2828,40392,3814,6181,1784,14429,1065,7608,1008,20570
+1399,23,1400,233,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 531,1400,343,91,2883,5080,2951,1729,326,531,1400,2883,5080,2951,1729,326,100,435,1399,11985,3742,91,3420,4532,2161,531,4134,15252,2161,1400,529,127,2161,2468,2161,98,80,2794,1399,1249,3840,16870,1609,27190,4922,5585,21455,531,1400,2470,80,100,1609,27190,2479,15015,705,425,5263,36694,5060,1596,6445,528,23514,529,5060,2270,4752,3824,4662,4174,2890,1609,3256,2939,295,425,5263,222,2303,5779,9509,1431,28242,529,634,1609,570,3609,5917,7089,167961,167961,529,2695,2789,4247,1816,30741,4993,3617,1145,944,2922,12299,413,5917,2953,1623,345,4134,167961,167961,529,29112,3221,5463,5715,16622,10916,2913,3442,529,2558,4247,2898,2273,3848,6614,3083,294,529,3882,2025,1033,20070,2695,1609,1755,14139,4432,15301,773,4322,1269,28107,167961,167961,1183,5150,2749,3671,1609,21455,2192,5060,2872,6201,1329,2188,21455,1623,4387,4134,28242,192,5917,1755,1609,3795,1391,8940,3420,2161,4627,1335,4510,1733,5181,1042,1609,5060,531,1400,3765,21455,2967,4247,3420,2161,3281,3461,1826,266,267,3872,1609,5060,2603,4134,28242,192,4941,15374,4662,6383,3122,435,3261,2890,1816,3556,602,6629,3003,36660,3555,5585,271,12576,21455,531,1400,5022,1662,6512,2200,2992,4532,2161,1399,1196,2190,3420,2161,3742,91,3905,372,5060,7188,3091,2465,36660,1399,3281,1399,21455,1867,1269,1183,23165,28735,585,634,267,4627,5917,2461,620,1622,827,705,1400,1662,11255,839,5664,3393,2057,15252,2161,127,2161,13838,8310,80,2017,3108,1653,4041,1609,3083,2944,8940,1744,1871,2967,1399,18328,3765,1622,620,28242,30741,49802,371,8402,2996,3759,390,6538,3671,16431,4902,3515,4527,1399,531,1400,3122,2998,2864,271,3826,1399,1391,1766,1803,2996,4662,21455,2984,5917,2558,456,2188,390,4284,1399,1622,1391,1766,376,1622,3034,2589,436,5321,11743,5226,7577,3232,4132,4146,15301,172,435,11740,80,1766,36145,4851,1391,1766,2192,3326,3684,6538,2951,175,1622,84,3477,21320,3848,406,2893,1055,4662,4247,4387,3461,9376,2270,9420,3495,4988,3123,711,2270,4064,4120,1399,3322,4432,1014,4662,14502,934,148399,116255,25077,1766,3280,6472,1766,3567,3468,6527,3029,267,2672,3800,1399,8874,1014,531,1400,5518,1329,5487,267,539,540,4997,1399,1766,4491,1400,1720,71,540,33,3048,1609,1399,2579,540,8641,47037,2890,2992,3461,233,3309,1399,1622,3872,3742,91,38880,1622,4697,5080,3484,1708,1595,1622,3122,3742,2959,1708,1399,1622,14,1162,343,91,1399,3440,340,3616,1249,3840,1399,1196,3420,2161,4532,2161,1400,15252,96801,2883,5080,4249,4636,3848,1399,27922,3840,3551,3540,3215,3158,21341,2814,125855,3729,3930,3689,3158,21341,2814,125855,3729,3213,193367
+158,81,23,336,49,53,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 6391,229,158,1043,2176,2133,15741,21634,15740,66,2133,15741,1761,6391,229,158,332,3311,16634,6201,4902,343,165,452,24796,1610,5701,15740,2133,15741,1761,6391,229,158,332,3448,66,16841,59925,158,403,16,3814,287,7023,165,1960,1973,15740,66,3283,3281,4178,332,54207,6185,15,26923,3050,54207,336,377,3097,14964,15,4578,158,1181,4354,4262,3967,2439,203,2149,7170,3475,8123,7176,165,16,2943,9655,16731,14964,5593,15740,66,3942,15,16406,4003,3748,3823,546,2948,343,5975,4258,1162,570,3122,7388,3712,158,2301,7648,3748,1029,3345,2141,29623,1065,4851,10215,1083,36690,631,273,54207,336,741,2657,7668,2141,29623,5131,95,355,7511,128282,2141,53,229,1642,929,1216,7734,43733,5584,11033,53,3718,63416,2141,336,229,1642,929,1216,507,5584,6391,229,158,1280,259,3035,158,857,27069,5741,287,67,851,180,229,1642,929,1216,12136,9841,5584,1436,1117,4804,375,15636,3441,2141,259,4187,4905,8488,180,3888,4039,7468,24005,65254,1057,158,7388,1007,66,5593,1389,26835,50498,3339,343,165,452,1796,2322,24796,1610,1484,11587,407,54207,3276,34870,72600,3918,1026,259,21045,445,3787,6820,2270,14342,1335,4003,3443,3520,158,7388,2943,7388,35919,5131,10090,16093,6317,9498,104,158,4882,273,54207,66,2631,229,7023,165,6697,4851,336,180,53,4156,7023,165,6697,332,229,1610,6167,7023,165,2400,3337,1795,332,15740,66,287,14,940,1162,15,21496,17313,390,3258,2190,16406,3603,253,940,4752,67,2898,3083,935,7023,165,857,2942,7371,2400,1973,2408,857,1048,1970,415,1014,3283,3281,54207,332,3807,4817,15740,223,1832,3807,3841,1859,5785,5593,5785,2967,3686,5960,2890,273,54207,54207,1228,15,1196,7461,7440,9498,1131,273,54207,1048,42590,1180,3841,2948,494,81,53,336,180,372,1180,6167,1131,54207,6185,15,3050,687,81,479,24351,336,2200,27625,1180,1284,2423,54207,6185,15,390,26923,3050,54207,336,2423,3226,7683,83083,3158,44168,2215,2814,27969,693,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+273,201,2128,2425,466,1078,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2128,71,3724,2846,1247,8212,67,934,71,2128,8212,67,1642,452,3451,2128,2366,2128,2691,1222,2348,273,221,1078,748,10281,1247,3724,2691,3724,2846,1247,934,2176,1843,929,2470,6168,620,386,560,8212,67,402,1541,403,738,1779,287,2322,2211,2794,2566,1214,4834,1042,21987,961,393,717,393,145,929,30,2951,1079,1221,1079,2794,67,4303,645,10390,10167,2322,631,2322,856,11805,10288,1247,287,2058,376,93506,2560,929,10166,2322,229,1247,11793,623,11925,623,4087,3938,2913,2322,273,371,1986,9210,3050,2769,2128,738,1501,3207,8212,67,2846,1247,1501,229,1247,1501,273,221,393,2128,3724,2846,1247,8212,67,773,2846,1247,567,773,273,371,1986,9210,3050,10272,2028,104,4740,8210,10220,2331,3110,298,435,3328,3096,1354,3503,7090,104,91,9510,10272,3874,104,3027,3471,8210,67,37,8277,403,1367,1247,778,229,1247,567,773,1047,221,902,355,8494,4247,10272,2028,104,4740,8210,10220,187,2968,298,3094,1047,221,902,355,3553,298,3094,390,6421,3050,2128,466,393,3066,3027,3471,8210,67,37,8277,403,1367,1247,778,9148,3211,1476,1620,3295,452,3039,3054,452,3036,3037,452,8212,2129,371,295,938,377,81,2211,1043,1007,2211,2128,2366,1199,3967,535,5568,265,2128,2425,9210,3050,2128,2425,3158,113489,2814,393,3724,16181,8212,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+1040,1041,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3,1040,1041,4824,69198,26261,764,2913,2176,8627,11120,271,287,1549,259,3032,2071,452,259,355,1482,274,876,3844,154,18425,2485,2090,1549,3071,2616,5091,3535,107,55113,2566,171,9,10,1482,18407,5091,3,1040,1041,4824,69198,26261,764,4813,24159,85,1111,531,2248,705,69198,20176,3112,3032,1859,56617,1597,531,2248,4358,13631,156,14965,23906,14929,58894,20176,3,1040,1041,2187,1530,1483,2295,5,1221,152,1530,4295,2967,9306,4938,531,2248,24159,1097,259,326,4031,425,426,3308,3023,5181,24159,85,705,3684,320,531,2248,24159,705,4430,2119,1041,4323,69198,18248,14631,3522,11081,5432,10903,3339,1597,10351,3609,4575,1436,531,2248,24159,12903,504,4849,1843,2944,52851,3030,17658,3642,4998,17112,20176,1041,56629,531,2248,24159,3570,295,531,2248,4227,8115,706,4175,1893,24159,504,71,5055,280,12903,531,2248,24159,1552,12307,531,2248,154,1883,3788,17311,764,1041,104,504,1883,2254,3015,673,1079,148,857,2119,7657,3546,175,84747,20098,1424,2992,57835,320,2917,24159,1746,4909,5181,24159,85,26456,4853,705,3684,320,3550,1770,5586,98,2248,705,9,10,4430,2119,24159,1041,3014,760,3308,1335,3304,2322,3,1040,1041,1530,1041,4763,4938,531,2248,4118,3308,425,1028,1040,1041,3742,4938,531,2248,24159,1097,3942,259,326,4031,425,426,1676,5487,673,3962,3522,1228,71,1042,7276,3032,4316,6077,1079,148,24417,1041,764,531,2248,1859,56617,1597,4358,13631,156,14965,23906,14929,58894,20176,2316,773,3765,3766,12903,504,2231,2560,7170,3242,3786,4968,14964,47566,6978,2231,3269,795,56649,3174,2944,4127,3882,504,24159,1097,4850,3712,54249,1354,3018,980,966,531,2248,46,88282,966,505,1423,2899,2254,6635,1950,1097,2953,5375,531,2248,294,8293,388,5343,109,402,41807,1673,9995,1673,9995,8390,18057,202,46,3216,1423,60331,3800,3799,4163,5343,505,4354,11345,30943,183,17442,1037,5605,6339,2781,531,2248,16,20176,899,54249,43658,4160,28083,931,3784,2616,3522,6312,19969,517,11081,5432,10903,3339,10420,1597,10351,3609,4575,1436,12903,531,2248,2560,7170,3786,3550,2982,504,15245,3799,4849,1843,2944,52851,3030,17658,3642,4998,2440,531,2248,24159,1826,17757,3508,7515,8124,504,3573,20395,31,17039,24148,20395,5047,3861,5218,10411,3301,504,71,1668,71,940,7522,407,940,2996,504,3032,4224,1344,382,24159,531,2248,2231,504,1826,3334,12213,751,466,2434,3330,16366,6171,5421,24159,24159,535,578,3300,1274,1087,147,505,6474,3788,2523,54144,71386,1959,1428,4227,8115,706,4175,1893,24159,504,71,5055,280,12903,531,2248,24159,1552,12307,531,2248,154,1883,3788,17311,764,504,1622,764,3784,6321
+1774,49,1974,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 9025,5151,269,1774,397,2890,8899,11796,2566,2228,1295,9025,5538,2141,610,7905,6077,420,490,343,4031,495,533,343,4031,533,269,1774,397,2890,1055,152,71,4937,2046,763,15820,741,1917,9025,2141,610,7905,6077,420,490,343,4031,495,533,6863,6076,343,4031,533,269,103,2881,3312,3441,729,393,533,1079,452,9428,7273,1774,3202,152,132298,2753,6676,505,533,1990,1483,269,795,5056,1774,3202,152,269,37972,3742,5811,9603,49395,755,6284,2141,355,397,3003,505,343,4031,353,533,1079,2951,269,3036,1775,2908,3234,3238,1488,1774,496,378,296,2206,269,11895,47069,4735,673,152,2719,1676,1774,397,3036,152,1581,1388,103,3018,3586,1391,1730,2681,1329,3862,2996,1519,6502,287,452,1774,5050,496,1774,3049,11291,496,7186,1832,11290,6570,1455,3262,3524,475,10811,3775,10524,420,18215,3014,1226,5900,8191,1409,3470,103,858,3204,1774,349,6360,6110,931,1424,1774,18220,4401,2996,20131,2206,2206,6842,3712,2144,8310,3603,378,6585,139,2077,7146,2889,3757,216,496,5609,2889,2077,9447,397,3586,1354,6082,3770,505,1774,1653,3611,1877,103,124,269,795,16,958,397,1774,269,2899,4031,1483,269,1774,3202,152,269,37972,795,5056,552,693,2967,4031,3013,1774,4254,397,1483,269,37972,6863,343,4031,353,533,1079,2951,10685,343,4031,10457,496,9314,10683,343,4031,6085,5994,496,11724,343,4031,3701,533,490,31783,2942,1214,1484,343,4031,1615,2078,156,2908,269,37972,2935,269,37972,3452,3202,935,1774,397,1014,958,3013,269,4031,1484,269,37972,4817,2935,132298,3013,13523,1014,413,152,3237,132298,4310,1676,1141,269,223,1214,6863,10685,2141,3371,2466,5424,269,37972,1014,6863,3874,3108,2906,132298,6863,2141,2881,2466,132298,2913,1367,5151,3742,269,2967,6538,3928,7792,505,533,1990,3497,24899,1774,397,1014,1226,2935,5279,3598,1990,505,533,1990,9082,634,221,6140,3483,729,9428,3013,3553,1014,3278,1774,7202,3009,496,3801,24899,5072,1014,269,5484,397,1774,3009,1737,5705,397,223,3497,67,1960,1014,5930,7273,1774,3202,152,1990,567,1752,773,5567,3466,2232,729,3466,1752,773,4819,372,1752,773,1795,773,5967,3513,8295,1774,4254,1014,9428,5151,5967,7822,67,5248,773,397,2898,1329,269,3497,1774,397,8840,3329,5072,1620,269,958,1774,397,14887,2960,8003,2960,8003,3246,269,4928,3014,1620,1774,397,2960,8003,2960,8003,2960,8003,856,3602,2960,8003,8003,373,3486,2960,1774,958,856,8003,2992,269,4245,4761,24899,1774,397,2890,3471,1990,2890,7108,1391,1143,280,3011,10684,397,223,3366,269,4761,5050,397,1014,4720,3516,3646,3742,420,6082,397,269
+2152,1599,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 5973,568,5392,1082,4181,2152,9456,3860,319,6,1611,3766,5310,4181,2152,9456,5310,3324,77029,63422,18428,63422,65683,63422,22655,63422,156709,63422,77041,63422,30196,63422,4461,22368,1019,4461,77037,4461,77039,63422,4461,77025,77044,63422,63422,128913,63422,2292,568,943,1082,4181,2152,9456,3860,319,6,1611,5310,943,13851,4181,2152,9456,5310,3324,77041,63422,77047,63422,4461,77037,63422,150769,2292,568,943,1082,4181,2152,9456,3860,319,6,1611,5310,15206,4181,2152,9456,5310,3324,77029,63422,76099,63422,104244,63422,77039,63422,4461,77037,4461,63422,124135,63422,63422,4461,77025,63422,150769,73379,63422,150769,22655,2292,568,943,1082,4181,2152,9456,3860,319,6,1611,5310,4187,31044,695,4181,2152,9456,5310,3324,63421,63422,92591,63422,77039,63422,134719,63422,77027,63422,166358,63422,104244,63422,77043,63422,63422,145059,63422,76819,63422,77032,63422,95754,63422,73379,63422,22655,2292,568,943,1082,4181,2152,9456,3860,319,6,1611,5310,13849,695,4181,2152,9456,5310,3324,77026,63422,77046,63422,63421,63422,77039,63422,120503,63422,92591,63422,77029,63422,18428,63422,77030,63422,63422,77041,63422,63422,30196,63422,77039,63422,4461,77037,134719,63422,77036,63422,124135,63422,77027,63422,166358,63422,104244,63422,77043,63422,95777,150769,92627,63422,4461,121782,4461,145059,63422,77040,63422,22626,63422,77044,63422,77032,63422,95754,63422,73379,63422,77035,150769,81693,63422,4461,82173,63422,109285,150769,77033,150769,80863,63422,77042,63422,4461,161090,114726,22655,273,2292,568,1668,1812,4288,1599,4181,2152,9456,319,6,1611,3766,5310,4181,2152,9456,3272,1611,141,15442,63421,90100,22655,273,22655,63422,77032,90100,161090,4461,114726,22241,90100,109285,150769,77033,150769,77042,90100,83075,22661,2011,2292,3496,4116,6140,3158,37477,3128,2814,74302,166359,2152,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+52,107,36,129,315,794,8,1072,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 501,1881,315,533,4740,3954,4740,2176,535,4740,3859,3881,2945,4019,1048,4134,1790,1162,1570,4019,501,1881,315,533,18602,2176,3215,3158,11065,269,2814,1880,7451,706,3729,691,330,533,315,67,253,987,315,763,533,3603,3416,37,2699,987,6079,987,107,4586,3686,1877,4187,315,1072,156,4762,1388,259,1072,2886,43234,3303,3872,764,987,8658,1072,156,76816,413,987,4171,827,487,828,136,9314,956,1188,1672,156,147,1407,611,601,987,5917,413,987,987,3857,2420,210,2420,315,13725,3349,3297,3423,944,987,10007,3108,15913,3005,2065,147,2722,611,601,11137,611,414,3930,2028,3930,11715,1778,2207,17665,4214,3666,3475,742,9619,755,475,501,2141,67,2911,535,501,1642,6585,2077,501,784,10429,6656,6653,6585,2077,501,1597,3471,501,1642,2566,377,2911,67,3939,4137,377,265,17665,7366,568,67,3247,3248,3250,3158,11065,269,2814,1880,4740,7451,706,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+720,2097,371,15,1196,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 720,2097,1065,15,1196,773,720,2097,1065,15,1196,1196,1908,287,15,5962,773,1032,5763,3840,1196,1908,287,15,5962,5248,67,773,7405,1108,434,1196,1908,287,15,3606,7084,1257,1834,1257,6390,4138,2164,17458,287,15,3027,535,2566,3014,287,15,330,8616,4254,773,15,773,1032,4171,3174,5763,3840,5248,67,773,4171,3174,695,15,67,3606,7084,1257,3204,1257,672,1424,6973,535,2566,3027,1199,1641,15443,2900,15,2900,2424,940,3589,1424,15,773,1032,5248,67,773,3606,7084,1257,14958,2900,15,2900,2424,940,3589,1424,15,773,1032,5248,67,773,34173,827,15,6097,2424,940,3589,1424,15,773,1032,5248,67,773,3606,7084,1257,34173,6185,15,6185,2424,940,3589,1424,15,773,1032,5248,67,773,3606,7084,1257,67,720,2097,1065,15,1196,229,6,67,67,271,300,229,15,773,1032,5327,648,2900,6185,15,773,6262,5327,648,6097,15,773,6262,3589,15,8309,3840,67,271,300,229,252,223,67,271,300,229,1008,4210,1834,3856,34921,15,773,1032,3525,287,15,271,300,229,1183,15,1196,21122,1970,15,1196,20179,371,21122,1970,287,15,20179,371,1357,229,371,81,1357,229,371,1970,21122,33,1357,229,15,1196,1970,21122,33,4692,4029,1357,229,15,1970,21122,33,30757,4029,2176,3930,17318,2176,34922,2176,14452,2176,34923,2176,15,773,1032,2176,18602,3215,3158,34922,17318,2814,3836,3158,34922,17318,2814,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+1022,1023,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3913,904,1261,186,2322,14738,26878,1970,14738,26878,904,1261,6406,14738,26878,2888,4689,349,904,1261,67,2081,14738,3896,4374,3609,1563,17845,3600,4374,4406,113,2316,1755,17845,554,4406,554,11740,3834,1331,2050,35372,403,349,26584,26918,233,14319,27028,13903,6823,52416,27158,20236,6880,2711,4236,14319,4099,1511,1968,2088,23895,435,14738,26878,27176,6823,6880,10657,27176,27169,6823,6880,1761,3393,82042,27169,20675,27169,904,78998,27169,1761,9998,27169,4187,22767,27169,2341,6823,6880,226,168,2341,1463,168,2341,54367,2341,19291,2710,4385,6823,6880,19252,27694,2710,4236,4385,1380,6823,6880,4077,55745,4236,1281,1380,122457,4236,52035,27915,2122,1380,54367,1380,2220,1380,4236,19252,1380,2929,8080,1380,2479,8080,1380,26918,1380,168,1380,795,2122,5019,1380,574,52397,1380,3861,26821,1380,4236,26821,1380,2929,55746,37,55746,2821,4236,55747,22964,55747,15015,22964,55747,22328,14598,1023,6823,6880,2929,7763,1023,16008,27360,1023,2929,13295,9781,1023,4187,82136,22964,30749,2121,23221,7759,4236,4698,9781,1023,1761,3393,14703,1023,4236,21968,1023,214,82084,26764,233,82084,2929,795,9781,1023,1882,1687,65809,1023,2929,23553,65809,1023,3063,1023,2711,14168,9781,1023,5515,1882,1867,1023,1281,1023,24700,89338,1023,1882,2122,47427,1761,3393,47427,2711,4236,1022,2711,47427,5515,27688,47427,2081,1563,47427,904,1261,2899,4374,47427,1022,2711,27688,2929,1882,2122,3686,479,435,5804,57915,6163,4540,722,1826,1022,3471,26821,57915,456,9995,1540,1023,349,5874,578,4236,2929,574,904,1261,1878,3834,578,49479,3639,456,2185,1668,5438,6078,3046,890,163,1827,89342,57915,2711,6474,3756,2711,756,8623,2185,2310,3118,1673,795,1023,3326,3096,14309,756,12932,12606,1540,944,6086,845,355,295,6087,3857,3893,944,687,3111,94200,3484,5438,15102,2929,42313,1023,3242,2316,10087,5496,835,6076,3108,12516,6973,1436,27688,4374,3110,6355,2929,53629,4374,349,2190,1022,2711,906,4374,2316,3871,57915,2996,1391,4399,693,3764,413,2310,1673,795,5438,827,49479,3639,5018,57915,3685,4374,1859,3311,2088,435,3433,27287,4125,233,1755,2929,8930,2929,42313,6163,349,904,1261,3117,22405,1826,1761,3393,57915,318,226,57915,1761,3393,4187,1540,1023,3764,3484,3118,3860,1673,3843,1755,3433,233,2190,3337,1196,318,226,13966,14308,1023,349,226,1023,8658,5438,3046,49479,3639,1882,2122,349,294,318,1092,4437,3311,839,4035,4374,1331,904,1261,2722,47427,10268,1694,5888,2591,1402,5159,1162,1673,6,1641,16402,4933,2209,6715,6340,4401,693,3043,589,944,23125,4077,377,10268,3807,4745,2818,4077,3686,3642,3854,3620,4374,5473,2952,2209,501,3509,1309,4254,2566,904,1261,3913,2176,2566,938
+992,130,808,348,23,2004,2005,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1833,4010,773,2954,1143,74328,15320,3655,78729,47848,11985,2004,157,8589,3658,78728,3735,4070,3371,1502,7670,1551,50858,2840,11389,4031,2954,393,489,490,106,2004,2004,2005,1142,3207,1524,3039,152167,2004,6652,223,6213,114,1149,3344,35516,1449,420,74395,64988,4530,3658,2954,1143,74328,15320,3655,78729,47848,11985,2004,157,78728,3735,4070,7670,1551,50858,2840,11389,393,489,490,5726,10453,106,2004,2004,157,1142,3207,2296,152167,2004,6652,3920,1449,15320,3655,78729,47848,3533,10181,10863,35295,2929,157,3756,3666,5584,1978,2161,35295,33479,35295,20675,1969,15329,371,2005,2004,54078,2005,6278,35295,6277,6946,1405,529,2739,37,54078,4892,1969,3311,4490,273,2005,6278,54078,35295,1799,43880,29465,4849,6355,4922,3964,2899,10084,17753,3855,4364,413,6971,491,4958,3118,4506,5106,7349,413,8585,3118,4530,2310,3677,4627,35516,2325,1449,35295,3666,773,3030,5576,4495,5842,54078,4490,273,4490,273,35295,827,6277,6946,29465,17753,4364,4506,5106,7349,3328,1983,4922,1449,17753,4364,4506,5106,7349,1430,4530,5576,4495,3204,4627,1983,1354,29839,1129,1784,1449,4819,4627,29839,33112,2927,1129,6946,529,2739,17753,4364,3204,1129,1449,3341,6392,35542,23172,3295,1129,6661,2530,6392,4530,5576,4495,8585,10966,6278,4448,1449,3677,10120,5425,3575,4627,1983,35336,4072,35336,4072,4072,1790,2404,3575,3558,11982,4072,3994,1152,1558,207,10966,1449,3553,3153,4448,1449,3348,377,4530,535,1901,3611,2672,13346,3829,35424,1423,8043,4072,5062,3611,1901,13497,1317,5425,809,1449,1152,4627,1983,3083,8782,8782,3328,2292,1790,2404,5425,809,1449,1152,47848,3655,5237,570,2316,4627,1983,1354,29839,1790,2404,9281,1596,6117,152168,1449,3049,271,175,15329,371,3964,413,10084,17753,4364,3013,5821,29223,858,4958,413,4506,5106,7349,8585,4530,1129,6946,529,2739,35295,660,3204,2681,1449,4530,3677,3311,8845,1449,1152,4627,29839,4922,13497,25875,24624,10276,1449,3800,2926,3328,2705,6076,2331,76583,2501,15320,1969,47848,3655,35295,4506,5106,7349,5821,29223,858,3204,445,6185,29839,1070,13497,5088,15320,78729,47848,3655,1449,1558,207,827,10880,1449,1152,14264,2190,1129,585,6355,4922,7206,1449,3204,2029,3835,5425,1449,14264,2942,1449,1558,7188,29173,35273,4836,14264,3835,7206,4761,2757,2580,10120,5425,1008,8081,22365,52491,1423,17433,4883,2028,4241,1449,5593,8845,13497,65007,15329,371,65007,5576,4495,52491,1423,17433,445,2028,4241,1449,65007,15329,371,65007,5576,4495,1423,3936,3580,348,26386,65007,15320,78729,47848,3655,16906,15329,371,5576,4495,3666,3658,5497,348,2286,3556,1558,1449,15320,3655,78729,47848,2929,157,147035,2287,43399,2287,2929,157,5865,29465,10863,35295,2325,10459,2479,47848,3655
+1370,1371,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 273,271,300,648,802,429,3027,3516,3051,2045,50868,13925,4091,318,25042,16948,1072,735,795,832,273,294,16072,1371,1033,2198,832,4221,3189,21891,735,16072,9217,2198,832,3841,2176,259,1371,2273,16,1065,91,1129,3050,1129,3050,4632,355,582,49424,5818,1129,3050,361,3233,1821,17530,1928,1821,11234,802,3419,1371,2316,3889,3566,3473,3737,4635,39340,1821,1235,1928,4314,3083,802,429,21778,3507,3657,3024,3076,1169,34229,1821,17530,75283,2790,4628,3330,3330,3309,3189,664,34229,9294,2316,5248,3918,720,442,4901,2316,2317,2393,4902,10406,2316,15742,329,3736,104,3083,802,429,21778,3507,3657,3024,3076,1169,34229,1821,17530,75283,2790,4628,3330,3330,3309,3189,664,99251,10927,478,7707,16972,20544,4111,478,539,15294,3334,75283,2790,3083,802,429,21778,3507,3657,3024,3076,1169,34229,1821,17530,75283,2790,4628,3330,3330,3309,3189,664,5940,5587,1269,4730,2046,3841,1490,104,15064,8297,2316,4456,4593,15727,116162,1964,1755,3083,802,429,21778,3507,3657,3024,3076,1169,34229,1821,17530,75283,2790,4628,3330,3330,3309,3189,664,2470,442,4111,1038,29517,44348,24885,74878,49424,17698,16268,6978,187,104,15306,618,2044,3083,802,429,21778,3507,3657,3024,3076,1169,34229,1821,17530,75283,2790,4628,3330,3330,3309,3189,664,6235,3071,91,3222,3050,361,3233,504,47996,1583,9789,112549,3662,1839,3443,3689,3204,3256,418,175,13571,504,13211,9789,112549,6671,504,4246,1247,48874,504,16016,14779,3443,7560,6825,3689,11602,18495,8967,14497,2106,504,14276,14779,3548,889,8392,11742,46659,14276,51609,15727,539,142533,222,15975,560,37,7060,15788,16016,14779,1371,2164,3897,259,4246,1371,1129,3050,249,3222,3222,259,361,3233,142534,1834,15291,11862,2148,2934,1007,2148,44339,142534,11281,186,15291,11862,1583,3204,2461,175,16175,175,1834,1372,8252,15869,4730,2046,11055,3638,259,11862,2148,1372,8252,5366,650,287,4357,4254,378,21465,505,1371,16072,96184,1986,1129,3050,15307,13369,3222,361,3233,1249,4763,478,259,9206,4730,3689,9491,1038,505,175,104,25220,3962,355,2753,522,1335,3204,3234,5593,3120,478,259,16,2965,1371,1674,6416,4424,355,478,16224,4031,1129,3050,6942,12454,3222,361,3233,3423,56,84273,4730,413,324,3014,6978,4717,5260,478,17071,271,300,2790,56,15064,5861,852,223,2211,355,67,75285,2965,7520,17161,343,3897,1371,13067,3502,13067,3502,2190,3050,249,3222,361,3233,271,1105,2090,17044,332,15064,3562,13571,1105,6436,10709,18339,3071,22912,935,5271,6086,5617,3897,10307,355,67689,3050,15555,318,3050,361,3233,14988,1583,4615,3038,4230,4730,332,1371,3566,175,14989,2927,2148,6101,1712,6440,10307,6820,1257,15032,1424,6339
+847,848,156,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 73838,73838,73838,73838,3609,501,1118,31141,6490,73838,3834,156,3489,2960,147,2310,2316,3834,847,43,848,18723,6910,18958,73838,42,43,80831,73838,121866,634,206,73838,847,43,2270,1734,206,2793,1730,1541,1113,18582,11818,1118,14935,11092,847,2755,73838,206,206,3195,2229,538,252,378,73838,3834,73838,2909,378,3030,848,43,1844,43,68624,43,2211,31349,39535,1202,73838,794,2960,147,3947,2781,147,361,2229,80831,1959,6303,73838,43,4218,1959,6303,1531,2310,113,73838,848,43,378,2699,847,14406,1803,5034,1241,3756,848,18723,2316,3834,113,73838,42,43,3471,38942,378,27319,372,2316,3834,113,73838,68624,43,3471,38836,3537,1959,6303,156,2213,1827,3834,3480,966,966,73838,43,378,848,18723,848,18723,349,2273,4468,14406,6490,2029,2699,6490,10422,1284,1734,1241,113,763,1241,56852,3274,3234,6983,6490,4861,314,2522,202,5564,5034,14406,1241,1803,4589,6501,899,1241,3471,32471,1241,13715,847,11818,2992,43,73838,349,677,475,73838,6031,4529,848,18723,980,14175,6910,3030,1730,2560,8869,31137,156,18455,37017,4883,796,2358,4273,16906,10613,578,2358,604,11324,50077,43,82571,8643,11324,18887,31162,32635,445,8858,2067,43,1730,2560,1959,6303,156,8328,8329,1519,847,43,1752,8328,8329,3234,252,3868,535,252,73838,2229,2600,43,252,73838,6974,4586,1790,2229,2322,2229,2461,6490,535,40831,1256,1541,73838,672,1476,847,1818,4322,847,5538,5100,14005,12826,11818,378,20,10843,8751,18511,580,271,252,2968,6,6656,6585,1141,3334,533,2366,2388,24948,847,43,349,2960,147,1423,5969,603,1476,8336,1968,3607,2553,206,795,4247,602,763,847,533,533,2366,2388,3529,6974,252,3614,113,847,43,2440,2077,73838,312,3470,312,73838,3558,378,43,848,18723,312,4259,11324,847,34,2159,42,43,312,4259,11324,847,34,1678,40207,2159,80831,43,4218,312,4259,854,34,35,216,1430,43,31686,33,6958,2560,2992,73838,438,5203,763,847,533,3532,763,1163,4375,847,435,898,535,41,13815,4288,435,2722,40222,36881,3346,13933,13815,15829,1163,2820,40222,4962,2488,4468,847,14406,2722,2722,718,1241,31112,6490,4918,295,4767,2722,2577,24305,42985,13948,1352,27164,2724,4249,5872,3532,1770,5832,2722,207,2896,4581,6405,535,3580,3235,2522,2560,6348,2213,2722,447,107,5881,2665,73838,73838,794,524,6031,4273,3272,578,2358,604,524,3834,147,848,18723,1354,6585,2077,3234,2896,252,3038,533,2366,2388,80831,42,5877,6303,1832,1959,6747,3558,113,73838,1512,6031,1512,1959,6303,156,73838,43,2975,312,4589,2159,3234,361,2229,3614,113,43,3603,253,3027,4763,2229,538,67,14217,474,2213
+332,533,2400,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 150181,8138,832,2691,147,1751,1228,87,533,2400,324,934,4087,152,8823,3919,2211,3914,6116,8048,8306,3648,148,8306,1751,147,1037,8306,147,533,1086,4930,1799,120,2012,1775,120,2012,1775,3371,2466,7927,7560,14100,18251,169483,7169,152,1483,8003,6041,141256,2014,2207,9664,9693,9529,36782,6866,1956,5538,9693,6028,96184,9693,1212,9662,5394,10331,7535,749,103,8823,9853,38313,749,3448,172,1228,87,533,2400,324,2970,150181,8138,832,87,136,4587,8138,832,393,533,259,136,3071,8138,832,441,2896,8138,832,136,3696,8138,832,2322,514,67,1008,8138,832,514,2886,2970,324,2753,6140,324,1116,2012,361,287,514,6675,147,87,533,2181,5476,2701,452,533,2794,3760,603,501,9192,491,67,229,147,136,1741,223,147,1738,780,8856,1741,2077,6069,6698,2434,9432,6380,11133,87,533,3756,67,2911,7167,87,533,2400,324,8003,5896,190,271,3261,2012,491,3942,332,1751,87,136,4587,12180,1960,5896,6242,87,533,2400,3942,514,4297,3419,720,2097,514,3308,38394,514,531,11744,514,2934,531,1962,514,2934,3419,38011,514,4087,7535,4023,87,533,5896,4176,6140,1190,873,38011,2023,1754,695,223,6167,3043,4763,223,5593,16796,2224,12334,14179,7063,14158,87,136,2400,6140,1752,2935,147,3696,1751,934,2887,2886,2046,938,2176,3158,150181,1751,2814,87,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+898,164,621,899,772,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1733,1037,3938,3588,772,570,452,686,2987,3938,772,830,2374,1989,772,1775,1990,3938,1766,3588,567,3671,899,3938,772,16,271,3333,4218,271,3333,567,686,3671,772,5904,772,5150,3967,686,3671,3938,1766,3588,567,3671,899,3938,772,16,271,3333,271,3333,567,686,3671,1668,8261,2781,357,3938,1766,3038,686,3671,403,330,3168,570,3666,452,3168,330,1766,3562,772,16,4752,772,16,8209,567,686,3671,3168,4450,772,686,3671,229,904,214,440,903,1897,271,409,1005,425,3938,1766,3562,67,7643,1574,2192,4752,570,9481,1766,686,3671,3025,3098,3038,686,3168,1330,2523,452,10709,1843,1766,1790,2119,3547,6258,229,221,91715,3782,2211,546,1735,2322,67,4043,772,3938,772,1790,722,1409,2781,2781,3263,4043,772,3330,5150,772,3967,3539,3938,772,1790,722,1409,2781,3782,3310,2781,3263,3938,772,3938,570,3588,772,570,452,686,2987,10124,3938,1766,6983,403,3267,906,403,3938,772,16,3938,772,830,2374,1989,772,1775,1990,91715,91715,47439,830,2927,5832,8114,1552,1075,343,3846,972,1423,3024,287,31,622,91715,1284,1409,1567,3938,1766,10124,3556,1258,3333,772,16,3938,1766,3458,567,3333,163,3671,3025,3098,3099,686,375,3333,221,567,3671,3025,3098,5268,4043,4691,899,772,16,574,468,3168,772,16,4752,570,899,1766,3562,772,16,3038,686,3671,3025,3098,91715,2254,1775,4199,3168,899,772,16,2192,5366,6604,7194,686,357,4199,2192,1859,3168,570,17624,1766,2119,5004,375,3300,3685,3555,3537,4218,7643,3938,772,16,3537,7643,1859,1877,535,570,1859,1228,437,67,4729,67,91715,772,148,393,6230,1989,772,1775,2534,772,773,772,1330,1735,147,772,16,1349,2211,29,2485,2691,19342,2449,19342,2168,3258,2234,1766,1990,906,3686,221,4227,5233,3268,3442,29,2485,2691,425,426,180,393,3501,3502,610,1735,772,772,4254,6230,2968,3603,772,986,589,772,934,817,148,2662,1037,10051,2523,633,961,19337,3339,1032,1651,772,1032,3371,634,772,1515,772,1330,1735,5110,2523,1989,772,1775,2534,772,773,2534,2523,3443,1609,6262,14150,1651,827,809,605,934,8048,772,649,2722,2662,180,6972,1735,772,554,1183,9358,605,32,20959,1784,605,32,1567,1749,772,817,772,535,772,6262,3871,809,772,3486,60674,3938,772,3471,3219,780,1143,5233,1141,4482,1516,6230,1970,1735,772,67,3616,67,1043,377,264,3215,3158,60674,229,1048,1735,772,393,3501,3502,1735,772,610,1129,425,3050,2769,8384,180,1043,377,3215,3158,60674,229,3158,2814,60674,1735,2817,2817,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+1412,1,1413,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 9,10,1735,101,1526,2691,425,426,4599,4140,1387,2028,12994,2691,115114,1524,7228,729,7435,438,6193,1917,50955,2936,438,8473,2238,3703,4010,2029,74662,3531,3798,902,3522,6826,19613,3334,4599,4140,2331,3026,14529,4706,4402,2691,3703,2310,4010,2029,30540,3531,505,74662,7822,1413,1074,3280,3614,3031,1102,2577,10534,1413,3377,29,12312,5313,3703,2029,20807,1214,4402,2691,3703,2029,902,3522,2863,74662,3531,2029,7822,2577,10534,678,1413,1744,6671,4444,5039,74662,3377,29,5313,3703,2029,20807,3027,3586,4140,4010,2029,311,29,5313,3703,2310,4010,2029,30540,3531,505,74662,3377,4452,2028,2176,3216,3348,311,3377,29,5313,3703,2310,4010,2029,30540,3531,505,74662,3014,2029,3027,3543,4452,2028,311,3377,29,12312,2630,3703,2310,6484,83620,2029,6894,9097,3531,95892,12580,74662,4452,2028,3798,902,3522,311,29,3307,5313,3703,7822,74662,902,3522,3377,4452,2028,311,3377,29,12312,5313,3703,7822,74662,902,3522,3014,2029,3027,3543,4452,2028,311,3377,29,3307,5313,3703,7822,74662,902,4452,2028,2176,2119,3547,3027,3543,4452,5973,2028,2176,14529,4706,505,74662,30540,3531,4010,902,3522,2134,67,2211,8594,13477,491,1921,49185,4969,490,9380,3216,3348,3475,3539,1430,110893,695,3906,7138,3441,5962,14529,114,5581,1002,6122,3440,5969,1436,2439,3930,3784,3930,11466,3659,1528,74662,6588,3271,3270,986,2864,4381,1214,1258,3495,9306,3607,1413,6805,8913,3328,2134,3531,67,1960,6697,3551,3859,3540,7890,7894,7865,6785,20807,20807,773,9725,8252,5538,119840,176776,20602,4459,505,1329,1330,332,3419,10099,7936,78550,9302,8594,13477,491,1921,505,74662,3930,2046,20807,20807,3848,664,2935,5973,8594,13477,119836,505,74662,51120,10534,388,332,10099,6028,81057,610,4969,6742,8594,13477,491,1921,6920,2046,3377,29,3307,5313,13730,1481,3703,4010,2029,3531,30540,505,74662,2185,3531,30540,505,74662,2185,3377,29,3307,5313,13730,1481,3703,3798,2228,3522,3531,30540,505,74662,2185,3531,30540,505,74662,2185,20807,20807,20807,3441,5962,4357,2691,6095,505,74662,30540,3531,13730,1528,51120,10534,74662,1413,3756,119827,3531,4444,8257,388,4016,2691,3477,7385,902,1413,535,74662,1744,50272,2934,2934,1668,4444,5039,74662,3031,103,51120,10534,388,3703,4010,2134,4402,14529,4706,259,35048,3271,2886,2996,3271,3270,773,986,2270,2883,51120,10534,74662,1413,2134,2691,1214,3475,986,1376,3703,2864,1214,1258,3686,5075,1074,1131,3274,4134,1936,1527,14919,3614,8923,2029,8913,1413,2270,1214,1258,1413,2967,103,9888,3686,5075,535,3495,9306,10534,353,2467,1214,5088,3248,20873,1074,2966,103,3609,3531,2270,8874,114040,1413,7573,7589,156528,74662,2270,10882,2029,3531
+62,749,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1562,979,832,343,91,435,1238,711,2794,3513,773,1956,11772,4010,773,21341,173762,52562,9,10,393,4470,343,91,452,343,91,452,711,2794,610,3779,2994,711,2794,929,3522,1161,856,4010,31,190,3517,2701,502,343,91,1008,223,435,711,148,711,2794,856,4266,4838,3475,20328,711,441,4057,929,4057,107,4099,9850,4010,773,343,91,452,6380,3030,785,793,931,397,2273,2794,4010,773,1799,2273,2794,1338,4536,1014,329,6069,3475,6960,8304,4010,5073,4176,6380,1799,4899,2485,330,1729,101,3939,4137,3540,535,343,91,452,1516,773,2968,3014,343,91,452,711,2794,610,1153,803,3695,3217,1607,4519,3371,343,91,452,4010,67,355,3012,452,355,3223,3224,3012,3371,114,1562,979,832,343,91,435,1238,711,2794,3513,773,1956,4010,773,21341,173762,52562,3308,3187,856,1258,3442,711,2794,610,343,91,452,393,4470,3012,362,773,3539,3540,4137,4790,4140,1562,979,832,2970,3308,9,10,393,4470,343,91,452,5581,1002,3906,3906,1970,3120,7890,1970,695,7894,7918,7865,3441,5962,3440,91,1131,3493,3448,929,3448,711,2794,3513,773,114,20122,3106,172,1562,979,832,4391,7462,6821,979,1424,2239,955,1424,70606,955,1424,5191,979,1424,1562,979,491,3295,3295,3419,711,441,711,441,4254,3853,3701,533,23705,711,441,4536,223,343,5121,3454,5121,2681,5494,711,441,2681,5494,27702,87145,1228,4406,2681,5494,1594,14435,3853,3770,4406,3295,20112,20019,4107,4406,642,20112,4107,20228,20112,4107,176331,4091,4107,1427,539,1969,42332,20019,4107,103,4107,107,2890,4107,4406,1899,20112,38532,3840,3454,23319,4099,4314,11188,1524,57259,5278,2794,5581,3494,711,4254,1676,1676,3907,3513,5073,11216,2968,6608,2023,67,2273,2794,6960,2273,2023,3840,3454,20112,4406,344,13977,1950,935,20229,4293,4107,4406,1899,2273,2023,3840,3454,20270,4406,64,4314,1351,535,16,711,441,1676,1950,2009,711,441,832,2794,5564,1950,892,18514,435,287,533,8630,711,441,4536,1950,711,441,14435,14484,711,4254,832,7068,1676,711,5218,2975,2951,4320,929,1676,3701,3190,5288,1014,5287,21624,856,20229,4293,1676,5564,1950,344,13977,929,28174,14667,15643,1524,20112,4107,3790,1668,27689,4374,4310,1002,5004,2408,3547,3516,3909,6122,1970,3120,2279,2279,1562,979,832,343,91,435,23705,711,441,4536,1131,2945,5880,1562,979,832,343,91,435,6070,14980,5741,2279,2681,3519,711,441,11985,4504,82,832,22990,3544,1795,8332,1541,82,832,4320,2077,321,1562,979,6070,5741,2279,1562,979,4819,4627,4902,20172,568,2476,2279,1562,979,4819,20172,568,2476,2279,27099,8630,711,441,4536
+1420,201,1699,271,409,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 4189,3436,2582,4819,4851,3696,71,295,1228,4364,4189,2211,67,3223,3224,4189,883,1501,3207,1420,4189,46,435,1229,1033,1420,4189,14838,3679,1228,229,271,409,3780,4140,3901,3189,435,2888,4189,1329,1006,3874,3281,1006,1420,390,1596,3436,2582,30803,2905,2190,28300,371,37,3764,1228,4832,479,882,435,171,817,46,867,1006,3021,1423,1006,30,113,2030,2206,3151,962,934,2292,502,867,1006,1317,6465,2185,1006,3021,6465,622,1006,71,631,3118,3696,4834,413,12447,3967,3938,711,15252,233,4189,711,4115,1420,1183,4115,1008,1729,457,4619,1065,271,409,3371,20591,20,30804,2886,1142,30805,469,50,14,1152,30354,1391,765,2968,882,3844,700,1699,5217,700,2199,1116,2968,882,5949,452,466,3436,2582,371,10166,717,3436,2582,371,717,393,514,456,1228,514,1391,2893,1960,4189,1699,15,1196,3158,30415,883,2814,4189,3436,2582,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+46,103,1611,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1611,4998,2247,4036,2012,452,3853,7310,3304,4357,1611,4998,2247,4036,2012,452,3853,1611,4998,2247,2322,3742,4143,2558,3926,1087,334,1006,3926,2753,5248,343,434,2012,452,2953,2454,4357,103,46,858,3453,9039,271,2012,452,3853,3304,103,46,858,3013,1006,3926,3926,1087,334,858,2959,6465,10,1196,528,103,46,858,3897,2168,20248,46,9,10,1329,2913,3448,2549,67,1087,2171,1552,120,2584,46,6077,1087,2171,253,3653,415,253,4254,1720,6610,3784,1676,3115,3926,1087,334,4357,103,46,858,415,253,6067,6320,1716,2012,452,9,10,253,3897,3926,1087,334,1006,3926,5974,1982,343,1228,452,1668,3126,940,2020,7175,2911,3033,6314,2927,6127,397,2012,1014,253,3897,434,259,6100,2012,452,3931,2012,1014,6501,940,2012,113,1014,2996,4304,2012,253,3897,672,5871,2012,3546,163,4610,2012,2012,452,3853,2316,7177,434,2012,420,3557,9,10,1029,34928,2141,1611,4998,2247,7177,905,660,3330,1668,3126,1228,940,6643,1982,5763,438,287,67,5494,2012,452,1111,535,67,3829,259,3603,373,3471,452,103,856,3443,2012,452,3853,4357,3287,1329,2794,3236,103,46,858,535,434,2012,452,1014,23238,2898,858,3013,858,3897,4303,3445,3494,104,660,3557,103,46,858,4357,415,808,2968,6608,6354,420,2987,229,4490,1141,373,257,1654,3471,259,163,11290,5513,1827,413,1329,7170,452,1228,705,539,2753,1611,4998,2247,2322,579,1055,5998,259,1211,452,1740,5279,163,4610,259,3603,3471,452,1795,373,1654,3471,259,2119,3043,4357,452,4997,3497,3453,5513,763,67,1611,4998,2247,1611,4998,2247,2012,3651,3158,34932,2814,3471,1611,2247,1623,706,3215,3158,11806,2814,1335,3304,3836,3158,11806,2814,1335,3304,4740,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+1366,540,1367,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2241,1366,2241,1366,6421,373,39370,12892,12538,1366,1733,1037,2241,1366,2801,5291,2939,4166,540,626,1981,2241,1366,456,4040,3565,1330,13929,425,7933,3609,84150,1696,1029,6720,15221,1366,8106,39370,5300,14243,67782,14743,425,7741,1366,5585,997,371,1130,4817,8488,3471,1128,271,615,1834,16,71,1199,221,2908,3688,1130,5291,2881,8407,2232,4484,1130,3491,5869,1892,1893,1353,1486,1330,1366,3283,3458,84755,3043,4837,1366,2967,100,1846,22856,5291,3263,1564,1565,1029,1252,50296,14775,2987,1329,3756,2801,5291,1366,4427,3348,1265,2030,2438,175,1867,1162,2232,1111,3688,375,148,5384,553,3493,1085,3752,1565,3501,4381,6331,10119,39365,6091,4064,1145,47289,3876,2951,2187,76147,2188,373,1472,729,229,1366,4427,540,1144,6445,3572,259,1127,10374,3844,221,4427,1029,28455,314,3536,2635,23885,6698,54203,2036,3765,1127,540,4432,25747,19539,1990,2192,163,60534,2162,2029,3470,2192,378,73,9,10,1366,4834,373,3283,2322,19539,1990,5481,1366,3451,9,10,3250,2485,6445,1144,2232,3483,2485,2719,373,3539,259,3841,12439,148,47439,2485,2162,23897,86041,3659,4627,1366,17750,1668,6747,1761,6445,2232,2149,1424,7640,15340,1029,9638,540,17603,30971,373,69181,3522,6445,7453,259,26429,3572,21136,16501,1366,2254,828,2934,3038,2232,4082,540,2149,2162,5567,4032,3112,3283,7023,82804,6445,4113,425,1264,717,579,1055,652,6492,20044,402,3833,39497,13940,707,6845,15149,271,272,5452,259,540,5598,3640,30676,17065,3030,271,4947,50296,4422,540,4202,50325,9473,5190,60300,5544,343,2188,523,26238,558,997,371,1130,1366,4962,10,148,6649,4365,18384,29,4490,3216,1968,1436,229,5615,3291,1072,16170,2208,4490,10,29407,27530,67,6421,373,1183,4930,2241,1366,602,106,1130,19978,2814,12910,5164,373,3836,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+2422,334,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3926,4920,334,2422,5494,9,10,5494,6503,2422,6248,2209,6371,695,393,4920,2322,4920,223,3926,4920,334,23852,934,2176,3906,2422,5494,2422,5494,6503,2422,584,2927,660,5286,13893,3954,6503,2422,2209,6248,7643,5394,7643,6907,6908,2941,867,119,13370,2422,773,2991,555,3553,67,660,10526,8893,3523,535,23852,934,2176,938,2176,3926,4920,334,3158,23850,23851,2814,23852,3570,3536,86368,23850,23851,2814,23850,4998,67,1990,2176,5569,2228,5568,2176,3542,4016,3158,23850,23851,2814,23852,2422,695,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+449,1612,425,426,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 12107,426,377,648,1524,3039,1985,1111,934,37488,2172,5560,1026,3310,8823,223,12107,426,3440,5508,343,2611,425,426,26280,14706,3281,361,3795,27634,377,980,1970,3889,3711,4789,425,377,6498,7387,271,409,6167,2176,856,345,1183,67,2162,1652,3786,1826,2176,7579,3786,425,3926,18519,4280,652,1986,652,1269,119,5535,1371,1778,355,514,2232,343,20147,343,1887,343,1371,147,2164,1330,3441,2322,1986,5465,13067,229,393,4255,1247,449,147,1612,3725,259,425,1189,579,1055,650,67,1335,67,4784,1676,271,409,2211,3215,54226,2295,2814,12107,426,5963,5508,343,2611,377,648,1524,3039,1985,1111,934,37488,2172,5560,1026,3310,8823,223,12107,426,3440,5508,343,2611,3926,18519,4280,652,1986,652,1269,119,5535,1371,1778,355,514,2232,343,20147,343,1887,343,1371,147,2164,1330,3441,2322,1986,5465,13067,229,393,4255,1247,449,147,1612,3725,259,425,1189,579,1055,5508,343,2611,1354,2960,3737,686,16208,14876,452,5917,4927,5508,5508,343,2611,2998,402,2611,1317,17966,411,67,5508,343,2611,3737,355,298,3509,1968,2488,2611,1012,6140,332,2046,4357,411,960,648,2611,54227,67,1856,3737,355,5508,343,2611,390,2839,37,425,563,1008,271,409,2002,7789,438,1689,32815,438,1029,1882,7943,34518,7789,438,1689,32815,1469,3061,43805,271,409,3118,1329,5699,54228,4490,500,748,540,3399,2272,32815,21395,438,2100,1607,2987,402,2113,2346,1490,259,540,5456,12248,438,1689,32815,4394,10051,555,2002,1143,438,1029,1882,7943,34518,607,1790,1125,3061,6897,271,409,2987,2881,1490,259,540,34518,2939,4421,6282,54229,20399,24989,15443,883,13940,34518,1469,8484,4394,10051,555,2002,1143,7029,438,34518,14888,1144,539,540,32611,3313,25197,4028,2002,1029,6632,9056,5465,7634,9,10,3927,858,1029,6632,9056,3453,1042,4315,21274,1125,30318,271,409,3308,3043,5307,858,1391,687,3642,3823,6681,856,5307,1129,30318,4315,21274,1125,2881,2162,186,190,355,30782,856,5609,7538,30318,4315,21274,1125,2579,3841,103,4315,382,1597,2051,20175,30318,4315,21274,1125,3215,54226,2295,2814,12107,426,15364,15364,3836,5963,5508,343,2611,650,67,1335,67,4784,1676,271,409,2211,3215,54226,2295,2814,12107,426,15364,15364,3836,5963,3926,4280,18519,377,648,1524,3039,1985,1111,934,37488,2172,5560,1026,3310,8823,223,12107,426,3440,3926,18519,4280,5508,343,2611,3926,18519,4280,652,1986,652,1269,119,5535,1371,1778,355,514,2232,343,20147,343,1887,343,1371,147,2164,1330,3441,2322,1986,5465,13067,229,393,4255,1247,449,147,1612,3725,259,425,1189,579,1055,3926,18519,4280,54230,225,8287,154
+119,612,2461,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 612,69126,119,5312,3043,158984,9760,490,7461,2046,393,4920,29,3926,3658,2046,3852,1143,612,69126,119,5312,3043,5580,158984,475,5227,9760,490,7461,9760,490,397,502,29,3926,3658,425,426,1199,3440,612,3907,122373,672,8297,717,1470,612,1108,2888,2836,253,17253,1108,3030,69126,3907,9774,3303,3909,3443,3525,3606,252,3303,935,612,69126,502,221,902,69126,3907,612,2461,3013,8043,5805,69126,3907,1712,3907,69126,2270,3305,5511,5511,4235,3091,413,3745,535,1956,6032,3745,69126,1108,3756,3246,3606,3745,535,1653,7551,5588,3834,2109,5511,3745,11982,69126,3842,535,3907,612,1108,5511,3303,11982,1956,5511,2927,21020,930,2996,2580,52678,52679,6249,3654,2270,69126,3842,3494,1391,456,10066,5511,55091,18078,10059,2185,4526,5511,2558,2325,1385,1417,7283,5220,3537,930,2580,2996,2580,2270,2339,535,2049,3305,5511,69126,10019,10384,6096,8847,5220,2589,267,1864,803,10495,634,2394,443,10072,1641,10059,475,5511,4653,1250,69126,1843,11693,5220,17703,5271,7283,3146,100,935,9760,69126,1108,3551,3882,2461,3569,3303,3882,612,1108,3907,8758,3551,3242,5511,3907,19368,5596,413,69126,5596,5511,3303,11982,69126,7370,5373,2886,413,2235,3303,4052,5511,2270,5236,1956,413,1956,2270,5511,3551,1108,612,4254,3303,3586,3467,10490,10843,2580,27884,7194,2461,10179,3303,3907,8758,3553,67,9760,1108,3907,5511,69126,2968,69126,1108,555,8306,9760,452,295,938,9774,3303,2461,3013,7218,10843,1108,5473,3907,612,69126,3303,3466,71058,3334,3518,320,793,490,2481,3779,1338,5501,3303,3615,2235,3609,8637,5312,3326,5942,71058,2481,1412,4533,3303,50176,3756,253,2235,11048,7370,2888,17253,10125,35944,1843,164943,21056,1470,6076,5236,50176,612,5511,5236,11048,3466,2235,8391,8641,3227,5312,1143,1970,21492,602,3303,11319,1843,1108,3303,2461,502,5312,3192,2461,612,69126,502,3341,3366,2481,502,3303,567,1108,3013,71058,2481,3684,3700,3466,2235,3606,3014,438,1843,1338,13516,385,5957,4063,2423,17253,397,4740,6069,1409,612,1470,3263,3216,2996,50176,11048,10843,434,438,122373,2580,10125,5898,1143,4024,23181,2784,1870,1790,980,1074,3857,8297,2967,2888,252,717,17253,253,10125,2725,17253,438,122373,2580,62543,620,959,3525,535,2958,5426,612,2270,10890,717,1470,612,3303,3288,1232,3082,186,3658,1127,119,5312,1338,2481,612,69126,502,3466,612,8641,2888,17253,11048,35944,1470,6076,3845,3846,8641,50176,295,938,3909,3443,3525,2888,10125,35944,1843,17253,2958,711,4239,252,717,602,3909,717,17253,620,612,69126,502,3014,1843,3054,2408,418,3448,3456,71058,37488,2481,4113,8068,3862,253,612,119,343,1232,67,355,24243,3525,14230,5426,8068
+780,834,623,591,223,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2316,259,3700,620,623,834,780,374,13733,647,4036,271,780,620,1043,377,934,623,2690,647,4549,21367,5126,5779,377,81,14591,14592,1111,2470,647,377,2470,560,3914,2470,1111,2252,1335,3304,647,9441,647,4838,3962,2211,1037,3120,986,5958,2162,1524,1335,8673,1524,620,560,3914,620,2211,546,2322,3458,3038,253,3210,3023,623,1641,1037,1387,857,2530,5105,2867,19337,1735,5958,623,736,1388,934,5126,5126,2316,259,3700,620,623,834,780,374,13733,647,4036,271,780,620,1043,377,18650,4730,4254,1037,1387,10809,425,3742,374,393,2322,929,3486,13733,552,553,452,4036,271,1043,377,4003,14,7175,2896,3503,2316,3210,3700,620,623,834,780,6538,5480,3032,2156,535,452,373,1654,3703,780,834,623,620,664,1524,71,324,2987,2960,259,1877,780,834,623,620,452,374,13733,647,2967,3686,287,14,2970,7071,623,13263,1766,780,620,4209,2451,780,620,4610,1733,4281,4247,3032,620,623,3503,259,629,3860,104,7289,1524,620,3210,647,3819,14333,686,623,8930,104,5041,4036,271,1043,377,1761,1335,2960,259,780,620,163,4610,104,3819,629,3860,104,620,623,834,780,229,3345,374,729,316,4125,3676,686,623,3479,6160,74,104,1748,1111,259,16731,16543,780,1733,620,6538,5480,3210,1956,1761,20317,373,5415,163,29,71,5159,2975,3032,2141,13733,6044,1524,9707,2043,780,620,5159,1524,620,3882,3210,14296,3685,3555,2960,3210,1524,620,722,1524,620,4878,1524,620,3854,1524,620,2440,4247,4686,647,3343,1623,4747,2200,629,647,3345,4087,1757,14601,780,620,4209,1483,1766,1264,3210,2156,388,223,388,6400,1766,1766,3588,2156,2927,2665,1423,7199,2367,622,229,9959,402,1552,2156,620,560,3670,622,623,772,3254,567,4209,780,452,1827,966,2960,2162,3210,620,96,4730,2864,3608,388,1143,5583,620,96,4209,1876,3330,2029,3947,6191,780,620,3210,3700,623,620,4703,3232,620,96,647,3343,3484,2960,4703,3232,3484,2960,1524,620,3232,1524,71,17715,3043,373,929,5415,163,4610,3032,457,6693,71,3210,3485,3669,3032,71,10378,1516,373,1524,71,4605,67,1524,71,324,2968,13733,1043,377,10317,647,5125,647,5569,154,3522,2211,3158,647,21843,2814,5126,706,4004,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+206,207,208,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1880,501,1881,207,208,8899,11796,501,1881,1881,1388,11643,9789,4074,11058,1146,13535,8949,31466,12676,7375,3371,8255,41957,3102,6781,41958,1524,18547,37201,16490,11642,8783,11342,6483,10900,9353,6588,42135,6799,6922,9800,9082,5963,41959,11554,12421,10770,3060,41960,2005,41961,207,208,3906,2176,7862,691,330,2109,378,5344,2560,2665,206,634,252,2077,3101,983,677,10345,533,2366,2388,7862,207,208,10440,2438,10799,5218,38707,1065,7608,1008,13511,10799,3495,691,330,1623,938,2109,1623,938,496,2438,11370,1393,1065,7608,1008,378,7646,443,5191,4655,10799,580,13511,3030,6715,10799,3452,3108,1734,206,378,5344,2560,2665,1623,938,378,3845,156,1712,3895,7176,31141,7608,10527,435,1065,7608,1008,2438,11370,1393,7176,349,693,2003,580,1660,7608,1008,1131,38819,435,3637,1832,1832,7176,7176,31141,4445,4655,10799,580,435,13511,31345,2603,207,435,14904,10527,208,4655,10799,580,3030,4692,2926,6348,10799,7198,435,4498,206,206,3637,1131,6320,1660,3637,4218,32346,8661,496,7176,285,1795,6215,3147,2522,206,32384,31686,6633,3834,1668,2369,8661,2106,32384,349,9498,378,31141,475,3845,3130,107,3586,3701,2665,5473,3898,349,1145,5940,1145,9,10,1596,13211,271,23763,435,103494,2395,294,809,784,5038,4171,156,2206,3898,4401,5038,6319,3834,764,438,46,1730,1143,2003,580,693,1832,3586,113,2003,1837,11097,496,2316,3458,4901,378,207,208,1836,113,14406,2793,10722,3779,52,2003,1008,3076,2665,207,208,794,2959,764,147,4401,6474,5917,496,2316,6474,3684,1329,1330,3782,1423,2560,2206,16,1574,3130,435,1039,5344,809,206,1623,938,7000,12526,14429,12526,1976,12526,217,47956,43543,38654,217,1424,217,218,6340,27836,4692,7646,3269,1114,1789,6715,2793,13353,435,1547,2857,296,10906,296,203,6254,4218,794,752,104,6254,752,30683,5934,752,13072,43543,752,206,5302,6340,4384,6715,5072,203,4468,6715,1455,52,456,16536,13072,176,58898,2793,217,38654,4529,1114,16683,14428,12812,112836,3644,3684,11092,3751,4813,11092,12812,12456,3458,11092,12812,3931,44030,30641,2607,203,52,11092,6715,9655,6715,11476,6715,3652,203,1455,727,3920,203,1455,8839,73,6715,673,4893,47778,3744,6973,4763,1967,3744,89,2314,6613,3553,206,475,156,30910,1488,203,3999,10852,12521,3216,206,3637,1660,285,1795,2522,5544,6414,8664,31686,206,4589,271,435,4401,193,11097,5302,1660,2252,14252,1038,888,447,634,252,1623,938,206,8927,10457,496,6585,2967,4972,1597,16,1827,413,1660,3341,734,2522,206,3586,906,1660,32384,2888,6633,3285,906,21020,6715,3452,1065,7608,1008,2793,43125,6585,4689,1108,533,2366,2388,3204,7413,10457
+571,31,1,147,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 5574,5659,9931,147,16,1795,17573,571,419,3493,4917,794,3118,147,9,10,3118,2960,147,7763,6116,1075,1423,3713,1552,119,773,4498,378,2439,147,1423,9,10,633,1671,20361,2202,4628,4917,6474,2888,571,419,7202,931,986,1622,7170,2959,2310,147,571,419,25049,6128,966,5917,2084,7917,6908,2084,505,3176,8083,6641,571,419,3898,3764,2209,3928,2967,2681,1329,4112,419,147,17358,334,3676,21926,3809,2975,4586,3828,147,16,1795,332,1483,2232,3283,2945,1183,343,9565,3759,571,419,31,1990,3115,1484,22667,21202,3999,3825,2917,147,2084,3256,26381,1247,221,375,6095,419,147,1990,29,280,5217,1247,1008,2992,1264,7218,571,419,1247,4766,18597,3493,3570,3809,1367,259,571,419,10144,7170,147,2206,2374,2992,7218,571,419,1247,3910,5271,320,104,571,419,1247,1843,6715,28076,1843,2589,2208,809,3503,8199,668,4433,1679,2914,7183,15892,571,419,3236,175,3135,2709,986,1373,3451,2967,3809,571,419,795,26978,14891,419,147,1990,5773,1247,1314,37606,571,419,5586,60778,2105,3825,3823,14119,4917,7645,287,4837,1329,1679,548,767,175,4361,2206,3823,1969,571,419,1679,371,1247,221,3945,7497,28076,571,419,1843,3703,1008,1247,385,8343,3828,8922,2049,1716,1843,6481,312,4990,8071,571,419,1843,37606,8124,2801,3168,6907,1843,5487,7371,7061,2188,5473,1247,1008,1111,1247,3238,3444,1630,571,419,1843,7078,3110,2794,33,2119,1843,3686,104,795,3260,571,419,6263,4791,78442,14119,4917,5324,3048,4688,5231,5486,147,736,3453,3928,2967,25566,980,4905,3237,147,5809,10272,7058,571,419,16504,4920,934,29920,626,1335,975,3667,6211,67,2211,5659,5569,3522,5779,3158,1055,2814,9931,1335,4808,21585,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+293,294,295,296,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 6704,124832,929,294,10906,296,3523,2181,7075,2077,578,295,294,10906,296,107,3123,6704,124832,2889,4259,124832,501,2871,1222,2701,3507,2181,873,6704,124832,3824,535,944,67,7091,7051,3663,8859,16,1662,2889,3158,1247,229,1751,932,501,2817,6704,124832,2817,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+1412,1,1413,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 19342,457,5958,29,2485,2691,3926,1735,751,2322,1735,457,1960,21629,14549,5958,3659,21629,101,1412,1990,6749,3384,21946,11240,62987,2339,3350,1103,21629,1413,3659,1412,388,21629,101,1412,1990,1413,1412,2254,1735,3234,376,67,1735,2923,67,3854,12005,8134,5984,1990,2018,457,443,3898,3030,1553,3776,5328,37,29,2485,2691,19342,4081,1111,3659,1567,299,1826,1567,3158,19342,2814,21629,1412,388,21629,101,1413,2967,3337,14533,21629,1412,6683,1563,330,21629,101,330,648,648,555,1567,5426,1563,21629,535,1413,3676,330,1970,6073,163,3648,1103,21629,357,1563,1970,2001,4374,436,21629,3250,2942,391,194,751,1990,3250,3350,1209,1103,2485,4794,3473,3366,101,2967,391,194,21629,214,4990,221,3250,1103,391,194,21629,229,2374,1412,21629,330,1563,1563,2270,21629,535,468,11755,1563,330,15621,560,705,3846,21629,6163,10616,1563,330,357,2152,27180,330,3307,3907,1143,2207,3271,3350,3320,25474,3431,21629,705,3846,3350,21629,101,705,3846,3350,21629,2967,21629,101,15621,560,705,330,535,1563,330,3846,229,3341,10616,3344,21629,3846,357,21629,3846,2152,3308,705,3846,1413,2967,21629,4589,705,3846,21629,3350,1413,8641,3530,10890,3241,8060,902,26223,452,4006,26223,1043,377,3158,26223,21838,2814,1412,571,21629,101,3204,3846,221,6163,567,571,21629,1412,3204,3305,229,3043,705,3876,330,24327,3982,3130,3846,535,571,21629,1412,13637,4247,3979,3350,330,1563,1970,21629,101,330,648,3130,65,1563,2589,3280,3846,229,216,3686,25307,357,409,26587,21629,3846,21629,6593,13902,6410,2370,14308,2077,4304,589,21629,1412,2273,21629,101,3970,6538,3043,966,2325,435,4764,34671,26766,23221,574,25660,10522,1173,1925,1867,27321,3694,21629,21629,535,443,18371,27237,3870,101,705,3846,3271,3277,1824,18371,27237,6076,357,27237,6749,21629,12068,1412,6683,27237,3870,567,27237,1990,1567,1826,760,1567,3914,15723,4247,1412,388,18371,27237,6641,2691,1043,377,3158,19342,2814,3870,21629,6749,10000,6683,10000,1746,14243,10000,2881,6661,3448,7799,6683,10000,1284,27237,7799,3870,6683,10194,1412,2185,1412,1901,9995,6791,4823,1412,4823,3122,21629,3276,1735,20794,567,67,456,21944,2025,113,1481,67,3629,1989,2185,18107,33,567,33,67,1412,21629,2273,6593,6410,13902,101,1284,21629,16684,21433,8381,15621,560,330,705,1563,3006,8381,330,1563,21629,101,3970,4764,705,3846,67,567,3236,330,2207,3271,3277,10616,3556,20852,4794,567,67,3565,20852,4794,21629,101,2114,1424,21629,2909,705,3846,535,3014,2228,3341,1970,705,21629,101,1412,3204,705,3846,3350,21629,589,4673,4794,3333,4738,2461,101,1412,376,4794,438,3502,1716,3921
+277,1,278,279,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 809,695,2974,277,809,695,1143,278,279,4535,45,2424,3825,6854,2889,2028,686,734,3269,5657,279,3110,278,279,1216,159708,6781,393,4920,3130,1131,229,273,371,1131,330,229,4535,45,938,2176,2974,809,1781,459,2974,277,1216,459,21538,1043,377,459,21538,934,2176,1043,2176,2753,3351,3158,21538,2814,3753,17695,2974,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+773,2157,2158,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 5567,8083,5151,10759,770,5567,8083,5151,152,394,5502,12915,15548,67446,2132,4784,2890,2709,2157,7168,5502,2485,1735,751,7168,3325,264,2922,5963,27342,1055,2322,1986,770,10759,2936,438,6193,259,834,5853,4247,34117,699,2132,20189,2132,24721,1483,7168,2891,259,834,3036,1775,4542,7168,1676,13618,1524,3039,2157,330,770,10759,2936,438,6193,3648,393,259,834,104,4928,234,2157,7389,5853,3582,5325,2890,2157,48645,7510,1775,4752,7168,5975,649,4871,2157,540,3609,1716,2157,986,2635,7024,264,3867,1049,5853,1111,2522,2157,6423,935,7024,902,5325,3146,4032,2157,986,3036,759,152,846,2157,986,5074,1676,2132,67446,2561,33022,3790,3751,4784,2312,3759,1264,4289,1362,1141,986,3759,2157,13095,3083,3770,4098,264,2157,234,11134,7844,33,6344,2889,3522,324,7024,5325,71,902,2157,4109,4303,1483,5511,1960,2864,5549,4303,3299,3603,986,3571,4032,2157,71,2558,7024,3146,3751,3234,902,935,14669,175,1826,1376,1097,1524,3039,264,2781,2157,1097,8589,4511,21273,202,2157,986,5020,48645,6303,1391,8940,1524,3039,3589,5020,2157,6684,1824,867,13618,1524,3039,1524,3039,8623,163,3686,48645,6303,4941,14652,8940,4794,1367,578,74,2157,1588,74,320,6603,3276,1524,3039,3464,7024,14306,74,3092,4711,3852,26591,3039,2157,3110,1524,3039,6348,3852,578,74,264,12631,1524,3039,3484,60718,8623,48645,2157,1802,3570,1524,3039,3686,4941,3464,5232,5788,4432,4644,74,7024,320,4711,8940,3039,8098,18425,8589,378,5934,3497,3852,2157,2781,7024,457,6127,3152,4847,13618,1524,3039,2157,3570,2944,3862,13618,3039,1367,3464,5232,5853,3018,2157,570,16223,1524,3039,51,2194,1524,3039,4109,264,4017,107,2473,3589,11198,5494,264,1524,3039,372,4639,4003,1524,3039,8623,5881,2157,986,1037,4010,8859,535,3570,1524,3039,264,5414,2157,6684,1824,2157,48645,6684,3852,3513,1524,3039,1014,1968,1716,264,8098,1524,3039,6348,8859,2815,2084,2157,1183,11766,4210,1014,5446,11766,3642,1735,7024,4109,2926,13618,3039,6348,5853,6127,2316,2157,535,60168,25116,6348,1601,4010,2647,412,3281,2157,1937,1735,7024,535,10205,2157,4109,4303,2157,3256,12387,4010,9501,3503,3039,3464,1524,3039,3224,271,40518,4003,9881,540,1730,503,2157,48645,959,24832,5511,1836,52063,670,1826,124671,3470,535,8134,2188,959,4482,3568,3076,578,48645,74,5373,48645,26502,16520,12477,13618,3039,3030,264,1524,3039,3867,1826,18400,1730,3852,2157,24288,1284,16076,14332,3870,29,2485,2691,2157,858,3586,1827,413,5254,13618,1524,3039,1284,5439,24303,3334,37,67,2157,4109,1766,154831,3018,2157,1367,1284,5439,24303,2200,67,163,124671,1409,867,2157,986,986,3967
+516,517,158,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 29623,103909,2046,165,18077,3158,29623,2215,2814,934,377,81,1335,940,2470,2470,186,165,67,3734,4113,3516,7816,3466,3310,103,2850,1402,480,5385,7023,165,660,3466,5131,773,103,1597,9306,1179,1180,529,839,47163,802,165,543,15219,1065,336,4451,40,1796,1796,6693,24499,4859,2467,4838,529,20328,47163,529,346,14162,1813,1631,29836,1631,95,165,1526,5131,3773,1973,63637,23260,4167,223,435,23722,223,1277,3848,2862,2215,165,643,103908,223,5131,660,802,18992,340,1597,5896,1960,2974,5593,1843,107,165,18077,2322,101,648,371,480,435,2211,2296,2046,165,18077,336,2046,332,2046,1072,158,96,336,2316,128,336,158,349,1795,1037,59925,158,403,336,349,332,2046,2046,158,4447,754,371,1033,2190,1070,14457,2952,3153,5120,371,14891,4922,70889,16857,17867,15,1031,10927,3295,764,12031,2046,4627,802,5131,51411,1481,701,3697,435,9995,4644,5251,1268,5131,4514,1268,1129,1065,3153,336,98,13687,2087,4442,98,20483,6128,1436,773,2316,1072,1660,44061,14168,1268,11773,23756,2312,2046,2316,8123,158,4799,16,4850,2028,3261,1354,5051,1012,2046,2292,158,3638,10,1065,2479,336,4799,3808,764,2270,2960,443,1065,336,6335,158,4799,2952,13647,371,3489,1129,531,574,5660,1354,15820,158,3808,1832,2270,2960,443,4445,934,7023,443,158,773,18286,20486,20484,28526,2044,9815,371,2046,2046,50517,2046,403,1481,336,20483,1317,26,768,7630,1329,3331,165,403,516,1317,768,2881,2046,403,2046,7023,911,2952,1145,229,5922,2185,5006,58152,378,2960,443,633,934,2190,141,1315,2022,29650,6284,63597,2185,5006,773,2022,14350,700,29650,6284,378,52,5688,14163,3751,2022,6284,79848,6284,5660,3582,443,773,2331,5131,2046,158,4447,3311,66551,5515,10032,1070,336,158,3018,8295,4445,3378,934,4439,2310,764,3808,934,1033,2046,827,2022,4401,336,3153,3043,229,2194,15174,701,4019,5083,22282,5688,10,15716,168,3018,1329,1330,5083,2022,29650,3882,6284,701,49236,6284,14350,6284,5660,2046,8123,158,3153,336,4447,1033,4922,101625,3568,180,2310,764,3808,531,280,91,3295,12031,3751,158,435,2952,3311,5464,273,69801,7224,273,180,98,413,3751,158,349,1145,1481,20484,28526,371,2046,403,4647,349,1065,336,20483,403,578,768,3097,1795,403,1264,20484,578,768,3812,273,2046,578,26,403,2046,7023,911,2952,1065,336,15820,2270,3484,413,3772,158,4663,371,1420,13676,6502,443,2190,158,99360,371,4447,98,109373,2952,34253,2272,371,3117,934,443,4445,3317,27286,6479,158,1420,1689,3343,25955,2185,5006,2046,158,4447,1065,336,3049,7023,911,2952,4851,9216,371,1420,1565,3494
+456,457,1381,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 4364,1381,7533,14,3942,457,9,10,3083,1752,4176,2172,17865,3501,397,2046,3295,273,1128,271,300,273,106,271,300,257,18167,5538,475,5225,393,533,1079,2951,230,229,106,708,303,770,25776,5538,482,14672,2322,5476,456,457,3451,5254,3050,5842,425,426,3841,3533,5584,5366,3522,1086,456,457,3451,230,229,106,3536,5036,3920,4364,1381,7533,14,3942,457,9,10,257,18167,770,25776,107,2254,3018,1143,6465,14,3942,457,9,10,2725,2203,3784,2580,457,1381,1668,457,1381,2461,6248,202,2292,1143,457,3774,2292,457,1381,3606,2927,29,2011,7331,858,1735,6192,1329,107,5088,2310,1049,966,966,6465,14,3942,457,6465,3674,1039,622,3494,1039,3353,3331,9460,1423,1424,1329,1423,1960,1730,2292,1143,457,3774,3030,2996,6465,457,1730,1143,457,1381,17865,3565,1843,5236,3996,457,6465,2292,6465,7385,5323,4861,734,2292,1143,457,3774,3600,2292,6465,47562,1087,2171,4632,734,3536,5036,3440,17865,2760,202,6648,3103,1744,2347,4150,703,2794,85524,5974,932,1351,4303,1652,1968,568,4072,7392,1735,3448,2270,3366,1103,7280,452,17865,15185,1744,1008,293,3790,2981,271,101,271,703,870,271,1376,457,15185,2753,271,171,271,101,271,2864,17865,2981,3112,3866,2029,2347,1468,3495,457,3866,17865,1037,2899,939,966,457,2347,17865,2057,3790,271,1159,870,1376,703,7280,452,1744,2347,3686,672,3640,3866,2057,5394,19508,5480,271,2057,3571,3586,3856,809,4132,2057,1652,1766,5838,7533,107,2461,6465,14,3942,457,9,10,67,2968,858,1735,6192,1424,457,1381,107,2725,622,3670,6091,3942,6465,457,2461,2580,4589,113,457,1381,6067,202,622,6091,457,1381,3658,3674,7892,889,457,2206,104,734,1143,457,3565,7538,6538,1730,107,3642,672,17865,17865,2057,7533,2914,673,202,271,2347,4627,4477,18899,7432,3946,6494,2951,2792,2339,67211,535,660,13211,457,7900,858,456,457,18425,6923,9049,2322,5476,107,171,202,403,173,3162,535,7900,3525,7428,2992,3926,1006,966,3162,120,3118,2106,814,3162,464,1327,5323,966,175,999,4913,1327,50662,171,2648,107,6423,7892,1143,173,3162,9,10,4432,1391,1143,271,3162,4225,1752,43790,1317,4968,809,3674,1391,3162,966,1969,4477,43790,3606,457,681,2203,3681,457,2912,773,5567,456,457,3451,3011,21723,20629,257,18167,6091,622,2192,456,457,21215,773,5567,456,457,3451,2322,5476,3011,158260,3536,5036,6069,3475,2316,6069,457,2912,6334,2029,3501,3761,2206,457,1668,457,6465,6069,3475,2461,3278,6069,6067,2029,622,6091,2206,2974,673,5236,3303,2029,622,6091,2206,456,457,3674,5248,6069,3872,3501,784
+1667,447,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1203,3495,1667,447,5770,636,8312,967,3920,1203,370,44305,9326,9326,1502,44306,528,6652,2028,27652,3388,44307,2028,3542,44348,3388,44307,3495,1667,447,5770,636,5584,44305,9326,6051,9326,3536,2176,3120,44308,930,10607,13393,8839,4138,4235,4260,3227,6693,6644,7173,3236,4961,156,10,6693,501,2077,5796,2077,1837,2753,6501,44349,4708,6399,2958,11630,906,6706,2077,636,1322,1202,2181,12162,809,11395,5975,7060,10145,1180,32095,3301,3495,1667,447,5374,3908,931,6647,447,21566,8768,23820,46,4171,1008,3533,5047,24979,3071,6647,5770,636,3110,35,2927,2077,759,760,2817,3909,1271,10352,44311,23381,1271,11796,3606,2566,44312,1203,1826,11680,23675,44313,2814,11680,1203,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+2102,23,882,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 4289,3694,929,393,631,273,3696,273,452,3106,469,457,452,4025,171,287,1526,3737,67,4289,3694,929,393,2398,1226,4289,3694,929,393,759,2579,2398,13989,4713,271,2398,4289,3694,929,393,3048,691,1226,13989,2398,4144,5055,4565,4221,4221,5055,4565,4178,4289,3694,929,393,3048,4713,271,5055,452,285,3014,2398,4120,1226,357,2398,4713,271,1496,4116,393,3048,4116,5055,4565,4144,4144,5055,4565,4221,4221,5055,4565,4178,3471,3734,24865,4118,4221,67,2398,1226,756,3694,3443,3308,3281,898,5168,756,3694,4112,603,7817,5200,37856,4588,2119,756,3694,3379,2465,3225,355,3379,2465,6278,4289,3694,1078,6017,6278,1142,2389,2102,3308,3189,5334,3557,734,882,5726,319,35,1674,7652,6128,1329,452,882,4245,2994,882,441,1477,2969,452,273,882,4289,3694,929,393,1908,1720,1477,2969,452,3333,882,3697,435,1037,858,2725,11916,20675,273,452,809,3677,882,3780,5936,294,386,3694,929,452,273,5515,2942,2549,10284,4588,6465,457,393,2102,18076,596,4718,20079,52,1228,5896,452,4254,393,3452,882,3032,5594,7123,4588,3443,1008,343,7277,229,1583,13990,3553,491,4343,3599,3497,393,223,452,882,3764,4289,3694,929,393,3261,3445,3497,452,3031,1228,2975,898,3106,3445,441,442,1065,3488,40,390,6017,6278,882,883,1142,883,11658,3207,13657,271,409,756,30305,2954,1494,139,3701,7885,13657,4289,3694,2886,531,259,2017,2954,13990,7885,2017,2954,2102,7885,13657,441,271,409,1502,21443,2954,5513,441,452,3031,2141,23991,154120,271,152810,1694,2028,103,1335,3040,5593,5182,4588,3443,67,5182,4588,7817,7123,4758,1391,2235,7817,6465,5472,3694,1729,4588,3443,67,1729,4588,7817,186,452,4588,3626,223,452,67,13990,3626,3225,355,5472,3694,3626,2102,223,452,67,28061,2102,1729,2102,756,3694,4287,3694,2102,2102,3800,377,898,273,223,452,67,4718,20079,7817,18076,596,1900,898,223,1391,2235,7817,1960,5896,223,67,1960,5896,223,3771,411,1228,898,223,2012,1775,5182,4516,7817,81,271,3169,3339,3458,3038,253,1321,1142,3862,393,3840,271,3780,9075,452,560,2102,1641,5182,3333,223,4605,452,1014,8003,4254,2566,3930,6140,3536,7613,5652,152811,91343,2814,4289,3694,929,393,6017,6278,882,883,3158,91343,2814,74820,459,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+2456,817,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 8918,229,1168,3270,4171,222,8980,986,2073,2993,4384,6858,1802,3270,4364,2141,3896,11101,1674,13657,2456,817,361,116632,12781,1168,2456,817,3300,2310,5230,361,116632,825,1674,2681,163,17562,35057,1802,817,2954,2966,12781,1755,3303,3265,1168,7808,1601,116632,2192,3627,171,966,12781,4578,3014,3265,7808,1601,1168,825,570,1921,7586,38088,1674,464,5236,116633,1769,2927,1143,2966,3670,1802,7571,4247,1674,464,1921,3532,535,2440,1601,1168,7808,3014,3768,6297,1601,3234,3999,1950,1674,146,38088,5840,116632,7963,28898,934,3270,2176,3158,1168,229,8980,3270,6858,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+374,49,1396,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 8331,3522,1567,2927,10525,1396,459,374,3639,3196,9296,610,8331,1549,1222,2113,29,2011,1008,425,426,3920,3639,10525,1396,459,374,2523,154,535,3946,8841,1396,3101,3501,1744,5979,4703,1826,434,2889,2473,8331,3522,3705,29,2011,3550,3328,1396,9148,434,2881,5962,6522,2665,3695,8331,3522,3705,3189,5206,3533,5584,6073,5366,3841,1222,2113,1483,1214,3036,36199,6810,375,5743,3033,5203,3536,506,60764,2814,3440,5763,3501,1744,5979,2967,3582,2890,3609,420,29,2011,1065,2789,535,6974,8331,3522,1567,1567,3522,7283,2923,5232,456,1143,59849,3871,8047,1396,3053,3673,5564,889,6974,9888,3794,7105,3245,62016,320,2888,1065,2789,1183,1908,1720,3871,3529,3582,3606,6428,3522,3705,2781,7105,3522,320,8331,3522,3705,6519,1183,1037,2890,1065,2789,2914,1796,2408,3456,2347,5077,672,15870,24509,828,3037,4102,62647,5551,1843,3686,3609,8331,3522,3705,535,6974,3522,1567,1567,8159,1065,2789,3101,2408,1396,1567,7105,62016,320,3601,3699,1396,1796,8764,2589,4052,434,808,1396,2968,2881,2889,648,8331,3522,3705,6537,29,2011,3304,1396,1796,3238,5741,3658,8331,3522,1567,148504,118711,105218,4761,3475,2131,128077,6211,3607,1676,6494,3303,3018,8331,3522,1567,3901,67,3582,1143,660,867,148504,118711,105218,3018,1183,8331,3522,1567,1567,3834,6069,5551,6974,434,7533,3101,2408,1396,3946,374,154,1744,1531,3639,10525,374,154,1396,459,154,3756,809,1396,9148,4703,3658,3305,1396,9148,434,2889,2473,8331,3522,3705,2681,1329,3246,4703,3562,809,1396,9148,2881,8841,808,1396,413,2899,1329,6479,434,5564,5496,3941,5479,1620,67,2030,434,3871,3947,1581,8331,5077,808,1396,3606,5473,560,1396,1796,3758,3049,3676,10571,434,3871,2881,6211,5962,6522,2665,3695,8331,3522,3705,1396,9148,434,374,1396,459,154,6474,3756,1641,21778,8589,3267,1730,37,3839,21800,459,2338,3639,1641,154,2168,2959,557,1623,7533,3024,11124,154,1649,3639,10525,374,154,557,6076,9148,3575,808,2408,1396,2560,475,1396,29,2011,1214,1796,1396,9414,3304,2899,5471,1720,1796,2996,73107,1483,3304,4022,8331,3522,773,2232,4006,3495,1871,1396,459,2523,172,1744,1014,2028,9296,44573,1531,10525,1396,459,374,3639,434,372,6076,1396,9148,5487,7533,1396,9148,10864,434,808,1396,6649,1143,2665,2316,12086,1396,2560,7122,2942,434,6649,1531,60679,154,1531,3267,4315,2722,11395,8125,60679,1531,4703,671,1396,9148,535,4120,10525,374,154,2945,1641,3967,60679,4120,10525,154,9296,44573,3303,2665,1396,2560,7122,2923,7892,3503,1396,9148,434,2889,8841,1396,3101,11395,3122,1396,9148,434,8159,1407,8868,4064,6974,8331,3522,1567,1065,2789,5181,8331
+1382,1383,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 76755,945,394,65019,107,187,4357,76755,945,394,65019,107,187,2211,7495,111293,7495,111293,52768,2814,2913,1280,187,26803,68153,5701,28887,21428,945,394,18359,45,2049,1264,15048,113,8268,68153,5239,49369,187,26803,8222,271,944,945,394,4241,3550,65019,18380,491,62026,2953,445,3215,3158,44312,2117,11680,12286,5538,3685,3565,68795,4044,944,10537,18759,15048,68153,3939,4448,4456,660,1264,225,1264,3557,7183,187,3090,1382,1383,90208,5014,18359,343,5312,4484,62026,62026,3844,5549,397,9,10,1593,1144,9,16003,2516,5091,1490,1180,68153,2967,49369,187,26803,12615,4250,16372,3751,2982,1074,1943,3686,3063,113,8268,68153,39563,2440,3531,14130,3589,1943,13741,20821,1385,1943,1945,3481,944,1329,3783,271,107,5812,15788,3625,4143,65019,18380,491,1354,3801,5986,5374,2331,4186,394,63894,187,3550,2927,660,2310,3772,113,8268,68153,6317,3063,3792,1424,827,65019,2470,3135,2020,4143,4448,3580,3030,2927,3553,68153,8372,6317,3063,49369,187,26803,41883,12615,4250,1180,68153,16372,3751,2982,1074,1943,3686,3063,1757,135599,2936,5225,18206,39563,14879,106,2455,50254,2939,65019,18380,491,660,3606,68153,5239,41883,19371,68795,4044,773,1483,62026,41883,660,3751,252,5701,28887,21428,135599,3090,3756,4310,1074,6297,1943,68153,10858,4230,15048,28887,14306,12410,944,4230,163,65019,944,4187,1038,5142,4187,4457,4230,4250,660,187,3204,29438,50646,1385,135599,3090,68153,1662,252,5046,6298,3113,14651,5466,535,68153,7796,9306,222,1716,5986,3090,1926,140213,1483,62026,5225,14139,49507,11544,106,1593,21428,252,3090,140213,3654,4310,7276,5701,28887,4230,867,6181,18380,3030,827,68215,5701,28887,21428,796,4186,20593,16832,3695,5986,3497,1733,945,394,271,660,3807,2577,3018,3600,2567,3758,945,394,5986,16579,6617,3295,966,6869,5986,3758,113,966,945,394,271,660,11405,434,56031,945,394,828,589,5986,3801,502,2567,3317,3642,6423,1716,945,394,3503,271,1074,18380,293,3315,3703,2586,34229,1567,15722,2467,4901,2888,83944,945,394,827,68215,68153,2440,2030,5511,434,437,945,394,10007,3614,945,394,65019,107,41883,6339,2440,3281,107,827,68215,68153,26803,187,12615,4250,163,2440,535,26803,187,4639,163,2440,535,3777,26803,3063,3090,62026,1483,1083,170895,5940,1596,20045,68153,3083,107,62026,3135,15035,4605,49369,187,26803,4878,5232,3625,2967,3063,4432,1226,41883,104,795,3037,2558,62026,187,26803,490,4031,2906,4605,10865,2635,103,107,2927,41883,9306,68153,2966,4247,4163,65019,397,2408,65019,12849,4222,2782,1179,3555,3766,113,8268,68153,434,18759,944,10537,10267,11108,3611,1943,944,4394,3783,62026,1383,4498,3844,1424,6101,2927,18359,561,2992,2782,2701
+1880,501,1881,115,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1880,501,1881,115,2560,2665,8899,11796,501,1881,115,2560,2665,113,115,1755,113,115,1755,9499,113,115,3834,2331,3764,1143,1330,259,1730,5494,1188,8808,8289,3265,929,115,795,796,533,2560,1072,156,9314,635,636,349,67,2911,535,501,1642,6585,2077,501,784,10429,6656,6653,6585,2077,501,1597,3471,501,1642,2566,377,2911,67,3939,4137,377,265,17665,7366,568,67,3247,3248,3250,533,1388,35,67,1881,8107,1335,274,2794,934,265,5569,5779,3662,1161,343,514,2219,343,4031,533,2176,3930,6140,3158,11065,269,2814,1880,7451,60006,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+52,107,36,129,315,794,8,1072,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 49947,706,827,487,828,139,9186,3603,6140,6140,827,487,828,139,9186,3603,3982,827,487,828,216,3118,3546,1694,2699,604,8075,2998,1407,5457,1325,535,987,20597,3352,44078,3982,3898,827,487,828,5868,2206,6163,1791,4738,827,487,828,2944,2565,1330,478,259,827,487,828,8215,3043,1423,2119,3546,216,156,3546,5236,3603,3982,966,1423,2960,259,827,487,828,827,487,828,5829,442,4225,216,6297,827,487,828,8628,4218,206,1037,3471,15883,14967,827,487,828,4539,3416,3234,487,828,14230,6974,252,3982,447,163,487,828,3785,8336,7136,487,828,2488,4120,2199,828,3749,2136,14144,487,828,2171,487,5335,1793,487,828,10087,827,4148,1072,487,10640,378,827,487,828,5479,5480,1843,2030,378,1755,3982,827,487,828,2913,378,9314,2665,2951,1072,156,635,636,6297,487,828,4861,8782,8783,1730,2560,1072,156,9314,6297,604,1730,487,828,3234,7385,2699,604,2522,3768,4607,8854,319,578,1812,4529,8937,1812,1812,827,600,2565,763,604,55087,4247,1240,578,1812,578,871,3982,107,3204,793,1014,1111,216,827,487,828,4361,1072,8659,2998,294,487,828,5132,2440,1014,3885,2316,285,5809,211,13771,4304,3787,734,3885,4022,7428,1111,163,1014,3043,297,3775,6297,259,1240,4247,5457,1325,764,478,259,4529,4999,5457,5457,2967,1325,28314,1325,794,487,828,5457,560,1325,1402,535,5457,1325,1746,319,695,1768,320,319,13661,259,4529,764,827,487,828,1240,13720,5457,1989,27954,1325,3982,987,611,2589,487,828,987,413,987,1200,1161,4402,3839,533,147,1407,611,987,987,2420,3297,30288,2420,315,2420,210,6297,827,487,828,312,52,2077,4218,8289,2029,4607,604,8659,8075,2998,3113,5457,1325,2722,987,3505,611,2159,2440,4247,2722,4127,827,487,828,216,784,1623,9186,67,827,487,828,3471,5233,343,1072,1003,487,4031,67,355,673,49947,3223,3224,2123,755,393,533,1079,452,287,533,452,343,4031,533,343,1072,1003,487,4031,269,3914,49947,2176,3666,706,706,3158,269,2814,1335,49947,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+278,1109,1,312,155,156,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 343,4031,533,20570,26170,19244,104010,61887,152,20570,156,397,856,393,533,1079,452,343,4031,533,20570,26170,19244,104010,22809,152,20570,156,397,856,20570,156,397,856,3906,14890,3441,5962,3440,5581,1716,8844,20570,156,3934,20570,156,397,3375,48406,397,5072,103,269,4132,20570,156,397,269,958,6214,2951,940,397,856,3479,20570,156,3440,5344,6337,2085,22841,4455,20570,156,11393,1950,20570,156,575,1423,5832,1075,6110,156,8182,103,397,4132,6076,856,11314,20570,156,3419,3440,2003,982,2145,3701,2665,8289,2665,5832,1531,329,7167,103,397,4132,6076,856,6585,2077,139,3440,2273,16163,8661,20570,156,6585,20570,156,20570,156,397,856,2077,20570,156,139,20570,156,329,7167,103,397,4132,6076,856,190,1960,67,6380,3440,190,1960,67,6380,2681,1014,6076,856,2906,3538,7869,20570,156,3202,152,20570,156,3202,152,16162,8525,1424,114,17507,4483,1483,343,4031,1615,2078,156,1214,16181,3011,16181,3538,39,4138,505,533,1990,3538,22015,3538,23870,329,501,3967,20570,156,397,856,14890,20570,156,3030,982,2003,1008,693,1660,2269,10527,580,6656,2393,672,278,6606,20570,156,2888,40450,6573,156601,207,208,113,115,12369,1397,6601,141046,4453,20570,6326,8950,114012,448,20570,1173,156,73878,6440,156,18334,2960,259,3018,966,46,2960,1832,931,3501,3479,3301,562,43321,156,2674,441,442,827,533,2366,74,6538,203,8710,2898,413,4527,397,2003,1008,3639,6091,271,67,43665,202,8615,5056,3030,14553,14554,3872,672,5038,3701,2078,378,17511,17512,20570,156,2992,1760,3515,2077,139,3548,4638,343,4031,533,269,3281,827,5074,4905,133628,397,10605,43869,71,1216,14,940,16180,6719,6196,5549,269,4031,29,1216,14,940,1581,20570,156,269,3453,20570,156,3202,152,2784,343,4031,1615,2078,156,6159,152,3569,1908,1720,4111,856,397,223,2992,36642,324,1141,1149,5352,71420,2992,856,20570,156,397,152,3569,2009,269,397,223,5160,17507,60875,1668,29,2393,2020,17507,4483,3475,5881,4137,856,20978,397,856,6167,4980,14553,14554,1730,1967,20570,156,46,2996,10456,889,8615,2914,8098,6214,4752,20570,156,4605,3029,3503,7916,271,5972,2889,2077,139,4605,9166,34813,755,2141,343,4031,533,5581,20570,156,397,856,3441,5962,5969,413,4527,4132,6669,7590,397,3639,43665,14553,14554,3329,5972,4009,378,20570,156,2992,2889,124,3897,4605,216,6885,562,43321,496,79,856,3471,505,533,1990,9082,3797,7117,269,324,20570,156,5248,795,796,397,5415,3897,21618,14553,14554,4066,43561,43562,1079,397,2794,287,14,10605,35654,1127,3770,3237,3261,3928,397,856,6167,271,223,397,435,2408
+2098,2099,1641,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2098,2099,1641,2098,2099,1641,12481,5496,1289,3768,2098,722,3091,764,3768,2098,2099,793,1318,2728,1641,2098,15970,987,3094,13700,4529,711,3768,30925,14158,183,2484,1407,816,6032,987,611,1730,4813,2320,2722,166,23738,319,3768,578,600,319,13661,13849,943,43123,16714,50,15680,13850,578,1812,15063,702,859,8899,6161,215,3653,8658,603,215,1111,2872,215,1424,2699,1014,271,3775,2136,3768,2136,1354,5829,2119,5110,7806,20749,15970,2194,4909,4202,3171,2571,412,5110,7806,2029,2634,535,4589,2200,175,1240,13663,4589,3281,695,1790,3783,1240,2522,447,2119,2252,13676,13922,1199,2389,215,1318,2975,13818,2098,2722,3281,5946,2099,2992,856,3478,447,7029,7761,2258,1402,14873,16124,2119,3736,986,3096,295,2987,3622,6504,2206,2701,1424,1111,2722,611,294,4738,3856,67,780,1516,1735,101,2098,2099,3471,3014,3219,780,3862,1216,2155,397,441,355,156,52,139,1160,343,136,4031,136,834,67,7037,438,1043,377,3158,38459,2814,613,287,533,452,355,613,397,6082,103,332,264,1271,1641,2098,2099,332,287,533,452,3215,3158,38459,2814,613,3729,1623,613,8332,11934,459,7037,438,934,2176,393,533,1079,452,3158,38459,2814,613,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+2142,2143,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3648,1978,219,35944,8918,1984,35037,839,2318,6526,26675,10806,1597,179,977,229,91,377,81,2211,1984,271,5126,5593,8980,1984,934,100177,299,179,3648,1978,219,35944,3648,35944,35267,10273,5829,2142,49698,17804,27183,27352,31388,2142,2142,6904,2551,17804,3295,31388,76393,3295,1849,3295,31388,3295,15156,8066,8066,10032,31388,17804,1757,3295,2142,3295,2142,49698,17804,83809,5091,181960,122372,122371,181961,1593,114237,2142,17804,2142,31388,17804,31388,49698,17804,17804,59,2142,3533,2142,11051,2142,83809,2142,7462,114237,2007,122372,9017,12075,1094,14474,16865,5111,6012,743,1144,13627,7837,16865,114237,2043,11016,5091,49698,17804,2142,17804,31388,10032,2142,105598,31388,8066,31388,17804,31388,31388,13592,516,88160,17804,19646,17804,49698,17804,8066,6445,2142,31388,960,4953,31388,31388,31388,2974,31388,31388,17804,114237,114237,2142,17804,83455,88160,8782,8782,7113,3861,1843,3648,3241,34942,114237,1490,31388,17804,49698,17804,31388,2142,17804,31388,960,4953,84840,2142,31388,181962,31388,105598,17804,2142,9400,31388,2142,17804,19646,17804,5398,5398,17804,49698,17804,49698,17804,31388,31388,31388,12165,31388,31388,31388,31388,31388,31388,960,4953,31388,2142,17804,79835,2142,17804,49698,17804,2142,17804,1520,11711,31388,15156,28717,795,28717,31388,11711,3648,3241,1102,1843,3861,125948,71,27352,3533,31388,17804,49698,17804,27352,3533,27352,3533,39283,1540,71,31388,31388,6278,6278,11707,20821,11868,24382,20821,11868,24382,20821,11868,24382,20821,11868,24382,20821,11868,24382,50277,4953,3623,50277,4953,535,11833,11867,30711,7704,17756,50277,4953,535,1827,9995,8067,50277,4953,535,5898,1827,9995,3216,6239,4740,3868,3315,15191,35944,2374,35944,5898,456,9990,1843,3843,3861,139934,3861,139934,795,139934,795,8067,139934,31388,17804,139934,121451,82831,2142,4668,2786,35267,24137,2143,2142,2759,2142,2142,17804,2142,13592,2142,49698,17804,31388,3295,1520,31388,50276,50276,1843,3843,795,3246,2374,34942,44378,3861,28717,795,28717,5726,20929,5726,20929,795,1520,3861,28717,795,28717,5726,20929,1520,2974,81090,44378,31388,17804,1094,7113,15797,2447,5726,20929,7113,5726,20929,2974,1520,1520,16865,5718,3216,6239,4740,3868,3315,15191,35944,67,1970,6982,3014,867,1984,1970,8238,5485,35944,539,3916,14034,612,1037,2389,3916,3421,10125,2481,1501,37,3648,2374,35944,5087,5,35944,20074,35944,1970,3542,59,159877,2321,851,295,938,2913,3681,1984,1960,1526,190,280,171,81,2273,2794,2502,1014,299,645,3236,287,5974,3914,5049,15429,2012,8918,393,2273,2794,265,5313,1043,377,3522,5779,4171,5569,299,344,977,179,494,2312,4370,179,2913,2176,96,299,645,4630,1960,1526,190,2511,2435,81,81735,3158,1984,229,8980,299,179,3836,3213,193367,193367,193367,193367,193367,193367,193367
+699,2155,2156,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 38135,44777,223,3458,3038,253,533,3451,355,9430,38135,44777,9430,38135,44777,1321,699,38135,44777,2155,1877,8306,40956,5,501,223,11729,377,81,38135,44777,223,3458,3038,253,3825,3453,2156,699,38135,44777,2155,1877,699,38135,44777,2155,1877,2927,2156,3699,2967,699,2948,40,6190,8167,2211,2948,2322,1856,1703,38135,44777,1877,699,560,546,699,2948,2322,2211,3219,780,1623,2454,1703,2948,2322,3614,2156,3668,7676,3699,3453,2156,699,2948,2322,3825,1856,699,38135,44777,2155,1877,8167,3302,699,2948,2322,38135,44777,2954,4909,2211,56598,533,3451,355,11729,3012,362,3307,2155,1877,826,11729,5610,1142,3207,3039,3014,67,567,330,1141,1142,1143,8167,1548,3115,3648,5837,3528,21734,8167,1548,3115,699,1622,1143,1548,3115,38135,44777,2155,1877,67,826,1501,3207,3039,699,533,3451,355,38135,44777,2155,1877,3224,3012,3371,67,38135,44777,1043,2176,37,67,2968,3553,37,9479,38135,44777,2155,1877,2968,3014,2566,699,38135,44777,2155,1877,8306,38135,44777,3522,6144,1037,1387,699,934,2176,2470,377,81,3771,6682,5568,5779,5569,154,2228,4998,67,1990,2211,699,11729,3233,2440,3841,264,222,7455,1622,8167,67,3027,2211,11729,40956,7455,4010,986,11729,3233,3027,2211,4685,11729,1888,699,2814,3475,3930,6140,3295,3158,699,2814,11729,38135,1321,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+941,942,535,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 941,942,8899,11796,338,2814,934,14387,934,25304,2211,14387,3933,1321,3106,457,2794,4225,457,561,452,1563,12271,67,1563,7205,3823,1563,338,51170,2183,127201,2333,2644,14577,4713,168,191,34947,9402,10008,1563,10082,773,1563,156,190,319,1526,941,942,8287,338,535,941,942,867,13954,2644,13912,941,942,5588,10147,2968,1031,1477,560,13954,941,942,6862,4529,385,1674,385,827,828,567,12470,3897,602,3322,932,1116,385,101,3556,3248,175,3523,3237,644,1526,338,393,4636,14387,13818,4636,8287,3277,4453,1770,535,941,942,2983,5564,2439,722,3284,4878,5232,1642,3761,3234,1526,2966,7090,711,5218,2945,2394,650,5656,3322,5062,4239,966,3511,7807,13948,1422,3653,1803,13948,1827,2899,1329,38585,828,13948,21533,7385,3809,13948,1422,1644,3556,3825,3825,3523,535,3322,3768,1312,4239,3256,10254,2481,23456,2530,1422,535,3265,29330,1526,3971,4692,2842,2312,127202,634,20941,494,3265,8843,941,942,385,535,1770,6998,3322,3284,602,14230,297,603,1226,3929,223,1111,3237,1422,4239,1770,385,827,828,13700,14147,560,67,941,942,1526,343,11643,1526,3525,19882,941,942,1149,5280,2374,703,19882,10371,535,941,942,1761,4310,4636,2864,6072,535,578,1477,560,4636,2644,14387,2558,3535,229,1216,2864,5987,9239,4636,3277,1743,1111,21655,6473,535,941,942,3581,1770,3921,535,13828,2996,1014,3311,941,4239,3515,12010,2996,3471,3219,780,1641,37,1288,1641,773,4689,2339,1014,2374,35,338,19882,3547,856,19882,6230,941,942,2211,3118,229,1216,338,14387,3779,6076,941,942,1676,393,4636,5082,321,12271,929,610,1216,3779,441,4931,101,645,3108,1216,1843,59431,5287,393,3701,441,50,441,610,1216,3779,184,385,1008,1676,3236,1131,20995,184,4239,438,3236,730,941,942,184,385,393,1735,2864,452,3926,1526,299,3531,610,1216,385,1526,388,184,385,3043,184,385,941,942,338,229,466,261,11450,610,5472,1754,555,1216,902,393,469,299,1412,10890,20863,2698,1642,1837,67,5472,1754,5530,4636,2579,941,942,538,4239,4254,3870,2644,645,826,388,2644,2109,1412,388,773,2644,35954,14577,645,388,2211,67,6996,184,2644,223,338,2814,934,14387,934,25304,2211,14387,1321,229,1043,377,5569,3522,4171,3522,5779,3522,154,3522,265,229,338,25215,2814,14387,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+93,36,2459,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1148,889,828,3158,5858,2086,2215,2814,9253,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+334,35,418,201,419,420,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1887,67,1770,35,780,15,1228,1990,229,280,35,419,139,223,47550,4838,2906,96865,5338,3645,393,1960,2322,2900,6097,1960,1770,35,780,15,223,695,3906,5338,3645,3440,114,5581,1002,438,253,5338,7344,7344,114,7344,5581,7344,1002,2794,96865,343,1257,3853,3295,3538,3538,1770,35,780,15,5338,3645,1770,35,780,15,2162,3597,5074,3237,3464,3797,1002,3034,535,3034,3470,4593,229,546,5899,2316,3898,2522,35,535,419,1432,3464,3545,3202,96865,958,223,2968,139,2890,7078,1950,35,419,139,223,2794,2968,229,15,1196,1228,3545,2927,223,9473,3454,3514,660,35,419,986,15,1228,2881,96865,280,3464,3545,3013,9473,3454,1716,6320,1432,35,535,419,986,20177,3628,4066,2009,660,3443,2890,2461,2968,3514,660,1734,867,221,902,287,533,1042,20177,3628,6067,2975,6117,1432,46,67,2968,3278,452,1228,15,3234,3043,2975,3454,20177,1349,660,5343,35,535,419,986,20177,3545,1901,2975,3454,660,1432,35,535,419,31,546,2948,2871,3696,567,96865,3453,1264,7270,4638,3514,3897,223,3031,4638,3514,555,96865,567,20177,2992,7270,4638,3514,223,20177,3545,2992,4638,3514,2914,420,8888,223,5781,223,2906,3471,320,660,434,2906,1012,778,2911,1143,323,1116,3234,6332,434,223,5781,20177,3545,2992,4638,3514,3236,3614,6320,223,2889,2522,216,35,535,419,4962,420,1432,3897,2906,223,1432,2927,397,1258,3303,223,535,216,2522,35,535,419,4962,420,1432,6285,3445,1432,223,280,3464,3545,412,5004,2975,3454,7270,4638,3514,3516,2906,223,1432,6339,3645,5226,3645,216,2522,35,535,419,4962,420,420,6078,6339,9889,2473,35,535,419,729,3828,3760,5899,1141,229,546,2975,729,3759,2906,397,2927,223,3494,3329,3645,223,2701,96865,3034,3516,2889,223,2316,6694,2975,20177,3628,3475,10962,2968,397,1258,6069,6090,223,5551,3580,3923,3897,1258,223,8664,6067,3928,3548,4638,3514,535,1258,3030,3474,3445,4361,223,3474,4638,3514,3227,280,3464,3545,6067,223,535,67,223,5781,8192,6090,2977,1258,2009,223,2890,729,3828,139,223,795,2906,6971,795,796,4638,3514,4761,2914,20177,3545,3261,535,96865,3034,2906,223,6339,3999,5781,3967,2522,216,35,535,419,4962,420,1432,420,6078,6339,9889,2473,35,535,419,20177,3545,535,3454,3030,3614,223,4361,3445,223,4638,3514,3613,4727,3542,3580,555,96865,280,3464,3545,773,287,3928,7185,7270,4638,3514,35,419,139,1770,35,780,15,1228,1990,229,280,35,419,139,4838,2906,5338,3645,3440,1770,35,780,15,1228,1990,96865,229,546,280,223,3483,2900,6097,1960,1990,7999,3797,1002
+2296,1141,1,579,1055,49,373,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3536,579,1055,4176,931,154,3536,2254,5796,931,154,3809,10475,3809,10475,373,4507,373,4256,3841,931,154,3859,2408,535,560,4752,4235,330,1141,33,3570,1367,330,2296,1141,3050,1141,567,3549,1837,579,1055,3050,273,229,3949,1632,2697,554,705,1367,10260,5879,3570,1367,3024,7869,3302,1043,3881,1254,1837,3216,3836,560,3881,2701,560,33,535,934,4176,373,3744,3451,2228,2566,3536,373,16796,4507,373,4508,403,3928,14529,2769,4336,71,2211,579,1055,579,1055,901,579,1055,16,579,1055,411,1111,5569,2228,1111,377,81,2688,3954,1524,1524,1524,19978,2814,39374,12910,271,87849,3536,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+233,1662,165,425,229,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 4922,165,25625,355,1752,773,2934,4922,165,25625,355,1752,773,2934,773,5567,1956,11272,16933,140058,4271,8515,2970,3128,1045,452,425,229,393,469,425,229,91,4025,2691,425,229,191990,4370,223,343,165,452,343,91,452,1463,4922,5187,435,2886,6445,528,6220,494,6504,25625,355,150179,1752,773,2934,695,3906,4482,975,772,99277,1936,21399,25625,2273,3988,15627,3304,7835,1622,413,7170,975,3280,5187,435,99277,1936,803,10944,5195,2501,3304,349,99277,1936,2466,13245,2466,15088,607,29346,23283,803,2466,3686,27517,4177,5473,3304,803,4134,1790,248,37,3216,6097,3674,1391,248,649,11097,2913,3304,4134,355,975,99277,1936,27060,4009,5080,1790,980,938,975,303,99277,2177,980,21322,3568,6474,535,4804,72931,3616,2340,303,9897,5080,5868,12411,1790,980,2465,4437,6185,1790,975,1330,248,37,27060,4134,1790,4649,975,3304,52,1354,3581,1237,456,25625,4578,3808,72931,294,23283,975,1956,11272,150179,1752,773,2934,695,3906,150179,1752,773,695,3906,695,3906,1970,3120,695,3120,695,5962,3449,2228,3449,5962,3451,958,30,1131,1214,2719,223,1877,25625,1671,287,1268,1526,494,5187,435,3929,1268,1526,1960,3457,397,186,660,165,25625,4627,6140,4016,3308,3189,664,332,2046,25625,1671,1631,3419,438,4778,1268,5396,5962,1354,2934,3308,3189,664,332,2046,186,1354,96,6140,3308,4819,96,1495,1662,303,305,4091,3449,803,47405,150179,1752,773,2934,695,3906,3418,233,20259,590,803,47466,425,1662,1849,1662,4627,96,10169,2322,150179,101,6380,1043,377,190,958,150179,287,1221,1960,3538,25625,4254,3618,150179,1752,773,2934,1970,3120,695,1970,3120,695,3120,2279,2279,2279,2279,2279,2279,2279,2279,2279,2279,2279,2279,2279,13856,66065,1646,13687,889,1849,1662,1646,4563,3308,13856,66065,1646,13687,889,1849,1662,1646,4563,3189,13856,66065,1646,13687,889,1849,1662,1646,4563,664,13856,66065,1646,13687,889,1849,1662,1646,4563,332,13856,66065,1646,13687,889,1849,1662,1646,4563,2046,1143,285,1795,480,2974,2228,2292,1143,285,480,2974,2228,13856,66065,1646,13687,889,1849,1662,1646,4563,25625,128,2842,1317,3419,25625,128,3681,25625,128,229,150178,660,303,9897,1646,2836,29836,1317,150178,660,1849,1662,1646,2836,29836,1317,10055,2279,150178,660,1495,1662,1646,2836,29836,1317,10055,2279,150178,660,5906,303,5876,1646,2836,29836,1317,10055,2279,150178,660,303,305,2836,29836,1317,2279,1495,1662,27958,659,660,2279,9391,4563,1849,1662,1646,3388,2279,3273,4563,1849,1662,1646,2836,1317,2279,150179,1043,377,16,5483,377,3616,2279,1752,1501,3471,25625,165,2252,37,20868,2279,2194,150179,165,25625,101,2279
+1818,23,1819,1820,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 11724,533,67,52980,3962,1173,43,934,533,67,1488,1173,43,6085,52980,3962,1173,43,2176,52980,3962,4256,505,4401,52980,3962,5343,575,52980,3962,2600,353,52980,3962,4586,216,52980,3962,353,6656,1519,52980,3962,52980,3962,312,397,4586,52980,3962,3553,67,52980,3962,52980,3962,43,31141,6185,1173,31141,3684,43,378,2535,1925,4647,12516,10508,986,718,6185,1173,6349,848,43,6402,2899,966,505,6127,1827,7176,52980,3962,5254,11135,3860,505,2310,1173,43,1329,3018,501,74,1031,3631,52980,3962,1620,3481,9,10,52980,3962,6355,156,678,2149,505,794,5343,9711,2425,1477,3645,5004,52980,3962,2077,11543,1867,1687,6578,2046,938,4256,1173,3068,2310,100,1481,5191,1173,6185,1173,6821,1173,5191,1173,12920,1945,3043,1173,1173,7126,5191,1173,3477,13246,10613,78742,1180,6821,1173,1391,1180,3341,5191,1173,6185,1173,6185,1173,50,5062,187,390,78742,6185,1173,1284,2310,4942,716,73954,78744,78746,6303,1431,78742,6821,1173,6821,1173,1284,1488,4468,2269,10956,1284,1488,2269,2462,1431,5821,595,475,3846,7198,3123,10860,2438,5862,7510,938,505,4401,52980,3962,5343,2781,505,3898,4354,52980,3962,5343,505,4748,4032,43,2003,1008,2992,2781,353,1819,1820,1819,1820,456,13802,5946,4134,3043,1925,6185,1173,3861,6179,353,5343,5881,52980,3962,3470,1819,1820,4218,3048,1968,3653,13873,14199,50,6185,1173,1820,3527,6185,1173,50,828,1837,50,828,2029,3106,1819,1820,2926,10663,10000,4538,31029,4647,2781,1968,13873,6185,1173,5373,12621,3503,1818,10527,649,6185,1173,5109,1819,1820,4428,4538,1818,13809,3684,2549,10422,50,5062,6185,1173,2665,163,505,8943,52980,3962,38720,505,1391,5343,38720,3970,4059,580,31363,1111,4032,43,1086,295,4134,3043,1925,3311,1819,1820,11462,38720,2185,11960,1819,1820,1644,2942,38720,1512,43,718,1819,1820,1241,3882,6185,1173,10000,13802,1819,1820,2270,43,378,10663,10000,6185,1173,2926,1819,1820,17364,579,580,41936,1111,4032,43,320,579,580,5109,4863,1241,4394,4498,4119,42184,4399,10010,579,1818,6185,1173,1818,1730,353,4748,1488,78742,6185,1173,716,2952,12677,43,5302,505,6127,7023,1173,296,1818,1173,5159,828,78742,10007,4705,938,575,52980,3962,52980,3962,378,7023,296,3030,3015,677,312,14175,43,479,6185,1173,4840,1481,1867,2438,1488,203,378,52980,3962,4218,3785,14175,52980,3962,3108,4403,1488,6570,3016,1818,6185,1173,562,52980,3962,2522,353,1488,104,3770,3744,4138,2951,505,1354,1488,6570,3458,1173,43,3898,3744,4138,1737,938,2600,353,52980,3962,52980,3962,3644,4048,2316,505,4401,496,6332,3744,4138,6281,2600,24897,3834,634,1183,12445,2620,6973,2136,21613
+1985,8,1611,81,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 852,3870,172,13263,3797,2029,4247,271,4938,1970,5334,4761,1960,1941,834,1746,1950,542,1111,901,59616,4571,1746,103,5593,6140,6140,6140,72395,1746,4761,1960,172,353,3348,2454,353,4761,1960,3570,30218,14659,4224,5782,151965,1746,6601,151966,2961,14362,1941,834,4761,1960,5110,1148,23262,799,7571,1834,1075,5110,1148,1563,252,2942,26684,14693,610,6281,1941,834,4761,1960,25263,3744,4642,25944,25263,3744,1834,3532,846,26999,3680,1481,3744,1730,14674,6603,31958,134288,1941,834,4761,1960,9092,4880,4880,3445,4642,1660,6281,1834,3680,3344,4589,11532,1431,3344,4589,3269,7354,72024,1431,3344,16055,1941,834,4761,1960,13169,21086,261,2549,1143,799,5972,1834,3828,2549,9460,3862,9351,3862,207,1073,12055,17013,4526,1941,834,4761,1960,1960,29379,1834,1985,764,3281,539,4384,505,1941,834,4761,1960,15415,1941,1834,1985,420,2580,4589,6501,1594,1941,834,4761,1960,1148,20544,1834,1985,8413,15410,2371,222,1563,321,442,1755,6416,1941,834,4761,1960,4543,490,1834,1985,3495,420,1563,321,1755,478,4224,5782,2900,15,3797,514,3797,514,2914,222,271,6077,6281,6412,539,1391,3797,3269,490,17458,4146,6281,10115,1141,1388,7514,26363,2753,14962,26675,223,2900,514,4003,6498,15787,12407,15737,1859,3547,4872,5825,673,1424,2149,26624,4224,5782,6185,15,3797,514,3797,223,1424,4120,60085,1676,1950,1834,4691,22467,734,3797,14705,1986,6077,490,931,107,5972,10260,2951,6281,3790,271,3334,435,259,16,7103,490,1391,2914,2949,1388,35,611,2400,6311,828,32264,16134,1388,3269,16717,2213,474,1513,2400,353,1959,2084,793,2951,2968,4224,5782,827,15,3797,514,3797,3334,435,2968,827,15,514,7103,490,17458,4729,5142,259,539,16,931,1676,10260,2951,4257,4849,1424,2149,5343,4195,2084,571,419,15108,1232,7103,5142,474,1513,2213,139,1959,2400,5279,4482,19158,1474,4642,431,1111,505,6675,1199,1354,5327,52,1620,1111,3024,6693,15738,1280,19158,10260,2992,4628,4138,103512,3515,4146,19158,1474,15415,817,10977,817,219,505,1111,151967,23604,376,2235,2909,12781,1674,2316,3898,1103,2235,817,1970,581,3265,1620,3819,567,686,2235,19158,1474,2525,715,1791,11234,4498,5070,505,1967,763,392,2699,3532,3558,1455,3603,253,2525,715,1141,3334,3823,505,361,104,17336,4374,715,3790,1409,4374,715,2254,3532,535,1391,3862,2960,5334,271,4938,2372,15727,15899,223,3897,2424,4482,100,15727,15899,4225,21332,3147,3928,15727,1211,1640,1054,15652,15650,504,6185,2190,478,107,15727,15899,764,2589,11282,253,1079,2192,3096,223,1141,253,1834,6091,67,9510,560,3551,5334,271,4938,2372,259,14833,3725,3043,223,3897,1834,2424
+46,103,1611,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2001,4374,157,20082,975,1917,3834,330,1949,4187,329,330,55107,23808,1424,1563,2082,1970,2001,3108,4851,2028,1970,332,3770,4406,2974,1567,5777,5074,311,5777,856,6031,29,3307,1271,3862,1970,103,1552,64,1720,1611,6279,1611,1129,1065,3746,1552,3898,349,1272,17336,4543,10160,46,370,2005,46,1552,589,3337,1970,10160,46,4374,570,55108,21401,2814,6120,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+343,165,452,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 45,5502,2215,343,165,452,2017,1265,755,343,165,452,464,940,151964,55381,45,45,3705,1883,3556,55382,29,1087,1221,1883,425,426,393,5502,343,140,13998,3451,343,165,452,2017,1265,1270,6113,343,165,452,464,940,151964,24637,20379,3339,2188,45,3705,33,4016,2132,24646,1483,55383,55384,2228,1843,8262,1087,3532,1843,1883,620,438,6193,3026,3705,3488,221,1679,6113,620,4905,3752,438,6193,2449,4441,6113,4227,555,29,452,1087,929,1221,3241,3241,5055,8219,4490,1970,330,2675,1125,12070,502,464,2929,4851,343,165,452,3343,35959,3627,2642,2642,734,1679,1755,6113,11825,2192,4227,555,3241,3252,555,1883,1567,299,555,3241,3475,4972,1679,1826,11954,4308,4245,4972,4690,5004,1679,3705,3337,403,1826,10374,1679,6113,4227,555,3241,114,5969,6113,343,165,452,3043,393,5502,343,140,13998,3451,2215,6113,1257,6667,1008,6166,393,5502,1257,6667,1008,438,5694,1047,3566,1008,3756,2188,438,5694,1257,6667,1008,183084,1008,464,5236,2642,3627,35959,5609,3640,16334,4174,2642,535,846,4342,3705,190,7562,14058,3814,2522,2424,2976,4392,464,280,2424,1730,438,6193,3566,2642,2235,403,6667,560,6840,1257,856,3928,3475,6667,403,482,3441,452,1257,929,2282,1008,76033,438,175,2171,464,6667,560,413,555,2909,2235,555,555,1257,856,3928,3475,6667,403,3043,6667,1049,2642,1042,5233,8754,1258,464,3663,1257,3902,555,114,1257,5962,2642,2642,1042,3547,2254,464,1833,5962,2642,3627,35959,5609,3640,16334,44017,438,6193,3566,332,2267,16145,2948,2132,4490,2929,4851,4179,343,12070,502,2241,1956,2534,3345,7673,2141,3187,20035,452,2929,4851,5226,1970,12172,986,435,2929,4851,3096,673,8900,438,6193,3566,1970,986,435,10176,183084,2235,10526,3902,5972,3627,2642,2954,2603,464,357,4638,7840,438,6193,3566,6667,986,1141,16145,4766,3515,986,6184,620,2891,438,6193,3566,16145,6184,4043,372,3546,10165,11870,4357,8129,4490,3341,10103,8238,2922,16145,12299,2115,137790,3345,2948,2141,2929,4851,3310,330,464,2929,4851,3024,6501,2954,103,2675,1125,113,2954,330,464,2929,4851,3343,1833,2642,35959,3627,2642,734,103,2675,1125,438,6193,3566,3351,2534,3310,16145,6423,6126,6425,3310,660,2534,229,3242,67,2642,4468,2635,3249,67,5569,4491,464,5569,1990,4490,67,3242,67,10176,2954,2534,3310,37151,3667,1969,3310,10130,4761,67,3477,12070,502,438,6193,3566,3341,10103,8238,3351,16145,12299,2534,3113,3310,330,2675,1125,12070,502,464,2929,4851,3343,2642,35959,3627,2927,183084,2642,734,16145,3310,330,12070,502,464,2929,4851,3024,2954,2927,183084,2642,734,113,1257,2954,464,103,2675
+1092,229,1093,975,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 62572,780,1093,1420,62572,1983,1420,1222,1420,4708,60393,437,5185,856,11805,3458,3038,253,1321,1093,67,8647,546,457,940,71,2566,5415,3885,2348,377,81,2470,377,5701,62572,7461,62572,1093,1093,6663,1859,1093,2177,3226,62572,7461,1402,14162,634,494,634,4511,1354,480,1093,4921,7199,2200,676,1093,1093,2579,20214,69631,257,280,2893,1093,1983,529,5944,3338,2899,4591,1117,1093,3295,4591,670,4591,3135,47337,7257,528,371,3283,2579,14189,1093,184042,3123,2036,633,839,1983,3339,4591,633,4591,5135,4591,3715,229,1983,393,469,3283,3339,1093,2579,3503,5944,2312,4905,839,780,3339,184042,1803,103,1093,184042,114,184042,114,3511,3123,2312,184042,5581,633,1093,25014,163,3775,15422,839,1983,62572,1093,4905,1983,529,7257,528,371,1983,780,1093,1095,7215,51,49679,2190,2789,62572,1129,1093,1968,452,1012,285,10422,2046,4016,184042,5581,975,3226,28245,6693,1420,1222,1420,4708,5185,856,11805,1321,5415,3885,2348,8647,457,1093,67,940,940,2566,377,81,2470,934,2176,3930,4144,3351,5963,377,3897,2830,102014,1420,62572,1983,148,5565,3158,2005,62572,2855,2814,1093,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+1621,2002,156,378,578,2003,1008,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 501,1881,20570,496,4740,3954,4740,2176,535,4740,3859,3881,2945,4019,1048,4134,1790,1162,1570,4019,501,1881,20570,496,18602,2176,3215,3158,11065,269,2814,1880,7451,706,3729,2109,496,378,2003,1837,693,10527,378,5344,2560,2665,2003,1008,3581,693,5564,5034,4195,20353,14133,5475,136,580,5,487,10527,1832,4374,20353,4445,2003,1837,703,6739,15587,3026,20353,163,8943,12143,6852,31363,7218,579,487,580,3828,4445,3305,20353,2003,1008,496,349,2003,1837,7384,1975,8941,20570,496,2992,2003,1008,4445,2488,693,10527,378,1310,1202,3589,1615,2003,1008,4102,4195,10422,3894,1615,2003,1008,4102,4017,4195,10422,3796,20570,496,2003,1008,4102,2488,960,693,10527,10422,2003,1008,7483,10122,960,1668,960,10527,2003,1008,580,31363,6852,960,10527,580,4300,31363,4218,52,11829,31363,20570,496,349,2488,52,320,4962,349,2488,693,10527,4263,795,3828,960,6214,378,4962,52,10527,2029,2888,4901,3299,2909,14133,35,11097,2029,3274,764,5038,9468,20570,496,20570,496,3030,12143,113,693,10527,2793,202,2269,2029,2269,3452,496,794,2269,10527,113,794,207,2269,10527,2269,10527,6474,4401,20570,496,487,6076,4187,487,580,487,10640,12631,10527,12496,1935,5099,18,217,1047,576,1832,6127,20570,496,104,357,20570,20570,4254,496,19823,42160,40518,19877,6964,156,113,115,40450,8346,12369,1397,31549,73901,53288,448,1397,31549,207,208,41414,41415,11521,448,2002,156,206,206,20570,156,3637,6072,3558,113,156,1424,12748,206,5811,20570,156,4529,31219,12378,113,89,16683,15971,12748,6264,193,578,2424,26,5870,1409,20570,156,3030,12143,2269,10527,3030,6715,3452,2269,10527,357,28667,580,18,4445,115,1730,2185,2269,10527,357,5099,15060,2002,156,3216,206,3637,1409,496,2269,10527,4401,634,252,634,3637,1409,496,156,4263,3030,3014,252,31574,29096,809,42128,7208,1857,54866,2077,4638,2077,2522,206,52,20570,320,602,1455,4032,156,206,312,113,7342,1688,4195,10422,2270,4401,2269,415,5099,415,1077,31095,1245,415,496,794,487,6076,567,487,6367,434,2980,8911,3452,496,794,716,1047,217,71420,52,8010,12585,2003,1008,4638,2522,2003,1837,2488,693,10527,2603,10632,2003,1837,21484,14406,2793,10527,39933,40421,2159,41331,40782,535,2522,2003,1837,3101,983,5781,3637,1409,496,2316,562,52,2077,574,575,2159,535,11829,2003,1008,7023,677,12143,5373,3452,693,10527,574,575,2159,1409,2159,10345,533,2366,2388,3471,533,2366,2388,2144,206,20570,496,2992,1409,496,139,139,3686,104,2316,20570,496,3930,2028,3930,23511,755,610,32735,1029,5790,873,8588,755,3475,2911,38821,2155,3651,67,2911,535,501,1642,6585
+2139,732,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 52,2578,2320,1494,5969,425,2578,2396,299,2906,3490,898,50,425,1990,3493,4265,13923,4201,3646,1960,902,52,2578,732,1494,1494,2578,2320,3484,3860,425,6465,2578,4201,11289,2898,1329,1143,2578,732,5361,27194,732,5361,4745,425,229,13095,5934,2578,4201,502,11815,3765,3147,1494,560,2396,2273,20,13964,2795,14038,2578,570,966,425,50,1494,1752,3663,1950,1494,1391,413,2781,4941,3304,802,1795,2119,3860,2578,2320,425,5254,4498,867,50,1494,3834,4003,425,802,1631,3148,50,2578,2320,21372,1597,4249,3311,3063,5109,1900,50,2578,2320,533,2320,2578,4201,11289,378,3015,533,986,10508,50,1284,2578,2320,5881,8307,986,1003,156,2852,25032,1830,855,1118,1003,1925,2274,4384,2096,39535,1202,3035,533,2560,2578,2320,678,505,2065,147,764,1003,1072,156,3765,3004,7369,2578,2320,36881,5564,136,378,2578,2320,4046,13954,10622,2731,4182,13978,20,20334,3758,106,425,107,3204,6715,1003,3452,1730,12516,156,2699,38456,505,5474,2578,2320,4989,1900,20334,3758,3416,1754,163,2320,4229,2316,44073,6076,2578,2320,1494,2316,14139,456,2819,2898,55514,97409,3581,50,5586,1003,4615,16170,3043,1003,487,2119,13999,14139,378,6661,18636,2029,14904,10527,14139,890,1436,809,273,1730,1039,889,3416,20334,3758,50,3189,9850,1989,1775,7657,3547,173,11580,8156,425,2578,2320,52,223,3490,3453,223,1111,3581,287,2578,2320,1494,4529,5182,435,898,50,425,1990,5512,2729,3531,271,2578,732,4289,692,4201,11289,103,223,5824,26337,732,2137,3189,5561,4600,299,3027,6653,546,50,1494,52,1216,2176,1668,2578,2396,867,567,2922,271,5184,11400,3169,2545,435,435,4304,3031,29,50,441,3531,20334,3758,2578,3498,867,5078,2396,2578,692,5872,3870,966,2578,8126,4288,1827,4218,3031,388,780,856,4066,2578,184,8222,9850,3914,106889,3897,3250,1754,4608,312,2578,14139,1222,2169,2351,1563,14375,21053,101,2821,2821,1754,3004,4195,10422,11815,12653,2320,30709,11818,4459,2578,732,5361,2320,2567,8318,3611,2320,29218,21942,4886,2320,966,3544,3885,26837,104,1012,3885,3118,1012,717,4225,3237,764,2254,50,717,3814,2969,717,1494,2729,3531,2577,271,4755,732,5361,4745,3324,3062,425,5413,2729,271,4755,2467,3110,13720,20334,3758,1012,1668,2139,2467,13720,1012,2139,2467,732,2139,21074,2893,732,1827,50,692,3996,1668,4401,4459,3674,38586,27194,732,567,191,3324,425,67,27194,732,9850,3914,1143,27194,732,221,1183,2476,2729,191,1412,546,4459,2137,3471,2578,2320,1494,6354,6853,889,11097,2025,10345,4459,2137,2953,5512,3490,1837,107,3204,533,4401,294,889,20334,3758,413,1001,856,4459,2137,1001
+2049,2050,468,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 362,2238,438,3734,3304,393,221,1766,3334,7310,3564,25149,5313,4016,3295,271,3774,7103,1376,362,26283,3371,934,3519,2449,259,457,431,3012,3371,1142,1008,2449,273,1908,5193,3012,3371,33571,362,7580,5826,11400,934,3519,2449,705,1780,3501,452,14350,517,1780,82877,2449,660,3207,1376,1004,3746,84754,5335,3050,4064,21563,2449,343,605,362,1265,3371,605,32,2449,2090,3501,605,1982,26283,3371,605,32,2449,1761,3101,3012,3371,2028,452,2449,5674,318,5901,262,9036,566,479,5901,2449,3134,3501,1223,28,605,32,2449,7533,457,297,240,241,45,3617,8673,2449,116645,4132,3012,3371,605,32,2449,16907,326,2052,20662,45,33571,2689,934,3519,2449,25564,2883,7859,1577,84754,13808,3651,2449,4321,3501,452,954,45,605,32,2449,605,32,470,9214,4657,3371,605,32,2449,4209,7461,4303,6838,226,45,84754,605,32,470,2449,1933,259,605,1424,34283,33571,259,605,1982,605,32,2449,3825,3501,2451,3012,3371,605,32,2449,15320,2206,2372,13515,566,6665,2372,2883,6665,2372,60093,4664,3914,3419,2449,5131,605,362,1265,3371,605,32,2449,3856,2883,26283,3371,33571,307,2449,2050,468,2291,1472,1357,6665,2050,468,154,4132,2449,2929,10,605,5457,839,273,13916,605,32,2449,3295,6567,24449,3746,6665,852,1008,2451,6665,56642,16483,2883,5794,2449,934,393,934,938,3536,2238,438,229,3371,3158,3260,229,3371,130610,63564,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+1452,229,91,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 21079,958,4468,660,2922,3486,71,10293,3034,7199,3366,958,958,3797,438,958,6077,570,873,2691,570,5620,645,570,2611,570,1887,403,929,3354,802,4025,223,570,1045,2951,570,1452,91,103,570,340,2312,570,3462,570,1039,1960,3169,3354,4370,570,3502,1950,570,229,1893,2485,355,8175,33628,10111,32,280,20773,2974,13907,1082,4201,397,1748,3072,570,62655,570,557,558,2691,570,5582,570,858,81,570,371,436,535,623,3527,5217,436,535,623,3527,533,8214,570,457,326,20773,3354,4755,287,12093,3354,1436,3658,570,4639,564,31,570,24585,4463,570,1813,52,31,570,4099,4024,3329,570,287,1526,1960,570,4439,623,568,570,20063,7457,717,11829,229,4132,1222,3211,3354,141,1642,711,491,652,1986,3169,3354,20454,570,4219,570,14538,1888,6599,7274,2366,22791,2018,3329,570,1468,1780,7122,629,371,4990,4920,31,5217,4990,4920,2980,1007,645,570,717,452,2018,570,1770,987,711,570,1620,3295,3508,2366,3488,3354,1253,2470,1237,1526,4486,2023,929,1477,570,4693,4486,12461,4937,3502,3694,82458,2102,20079,52,229,2312,298,570,642,692,623,629,570,10724,2977,557,437,2294,6972,1729,554,570,557,558,1960,570,2325,1399,5582,570,259,1737,19376,287,533,452,570,8630,20056,3329,1642,2011,570,987,711,31,570,371,287,533,570,2312,645,1651,570,28355,644,191,141,2940,3519,20773,3354,141,2940,43551,8156,3354,3694,22060,33628,229,1039,1960,3169,229,1986,3169,570,287,2058,31,570,4303,570,857,1837,570,371,397,452,570,2790,6820,5788,570,7372,3371,3509,6352,32,987,711,31,7216,7372,371,31,3354,273,466,717,751,2980,229,4897,1973,7014,9106,4808,1652,491,3354,1652,491,570,90364,1986,570,122112,1652,491,570,58147,1986,570,59638,1652,491,570,122113,1652,491,570,7014,45332,1652,3169,13966,5777,570,273,1420,397,452,557,558,397,570,2502,4025,570,4172,711,219,1594,570,141,2940,43551,8156,3354,711,16181,33628,141,2940,43551,8156,3354,8715,533,33628,141,8715,533,452,3169,2424,16831,5656,570,229,926,494,570,614,1526,1960,570,3419,1986,554,3696,570,717,452,190,570,91,1351,2018,20773,570,5821,645,570,494,7068,570,8630,2312,570,2190,1092,2401,3329,3354,9509,1431,1652,3169,2946,10803,2018,570,229,1693,570,494,1526,570,3349,3504,623,570,261,2312,570,9509,1431,1093,2579,3354,2974,1693,570,287,452,20773,570,2545,10803,2018,570,3834,15,3169,570,6077,660,570,2584,9148,7216,3488,21624,570,377,322,570,4636,546,570,14338,1196,570,473,10390,20773,3354,2534,570,229,2485
+336,46,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 336,3158,3753,4302,2814,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+1857,703,1858,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 40016,19021,1858,6715,1857,88282,11335,35603,40016,19021,1858,6715,1857,88282,11335,5584,19281,4039,120014,6028,19281,27069,129526,6293,120015,2272,43753,8468,120016,120017,27238,507,8116,5962,3614,2635,1857,30943,1858,456,14042,10800,40016,19021,3779,26812,1599,166,40732,3529,107,71911,2440,2467,1079,14042,3452,4475,414,1284,5078,11918,1857,3030,107,6339,1857,88282,71911,25159,12750,40016,1858,3860,17582,1563,809,25159,12750,7916,9158,7187,10800,2522,1857,88282,1563,67,4199,7579,107,3897,2982,2983,10485,392,3933,12623,14654,10800,5019,2231,19021,10722,1064,445,32237,320,1858,142825,40016,141395,61518,109547,1145,10531,12750,751,10714,20898,17584,7892,18796,2211,3128,18548,505,9193,10721,141,779,3746,3207,2296,25045,25046,6652,311,2028,35603,9,10,393,4636,4636,397,452,3930,3158,12907,3128,2814,35610,35603,660,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+1183,164,373,1184,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3734,14529,6577,1927,760,7029,4068,3734,14529,579,1055,3734,729,6577,1927,579,1055,373,257,1654,4740,3348,7310,3304,2322,3734,729,3734,14529,6577,1927,5963,22724,1927,763,15820,4004,2254,5809,373,2228,163,4140,9,2162,15820,1192,10411,373,4850,2140,14529,3556,119,14529,373,634,221,18595,136,397,4132,1960,1990,1111,397,487,136,373,2987,15820,3031,13997,901,1424,505,1423,136,425,12107,579,1055,12107,373,15820,373,634,221,3329,2231,154,2071,3875,4937,1990,3043,3581,259,153,4603,4281,2231,3503,780,382,5502,221,19340,3032,3014,373,3031,9460,17661,13315,5978,2322,3750,373,4817,2187,343,152,1374,24997,4899,1354,3234,4140,9,2162,7428,104,3260,373,506,9,2162,154,3696,3692,1143,3742,3547,3825,1192,764,373,3759,3162,2914,52,3122,71,1192,3659,5609,4175,8115,154,3696,271,10411,1008,3897,3031,2975,1192,764,271,1008,2889,3823,1111,764,1192,557,5513,71,1192,4638,1192,71,1775,4199,3256,1877,3032,2914,52,402,3278,7280,3665,3523,20248,7280,3654,2653,11223,21002,4175,10411,1192,7642,7716,2119,253,6577,861,83729,3090,14901,4642,39,2187,535,2423,373,50,2171,1012,4357,1660,3043,15036,3573,5811,3025,4507,373,373,727,3227,975,535,2192,634,579,1055,722,1927,999,2310,975,2983,3043,2187,343,58127,152,343,2187,39,152,15036,2890,373,229,4490,4620,1141,5254,4357,373,20696,50,2171,861,3985,373,9,10,171,259,764,5593,2188,152,4598,163,861,2968,8637,1790,861,2168,373,175,705,6163,87530,535,4357,540,542,2616,1653,1927,999,727,2188,152,780,4598,535,861,373,171,259,764,780,727,3265,56618,3235,535,975,2589,3819,2616,2188,535,2589,3819,1927,579,1055,3588,2400,1037,535,861,15036,3448,4881,2589,4881,1037,5427,1103,861,1927,3586,2310,861,373,4620,373,229,4490,373,4357,3043,373,171,5699,764,705,29,464,5473,412,861,2270,861,3366,861,1927,2556,1183,253,3283,861,3014,67,229,4490,607,607,3280,579,1055,3734,5144,239,2058,2769,3962,3304,4672,4653,4620,607,4672,607,4357,607,579,1055,239,607,3531,3532,3304,3734,5144,3734,5144,1843,4672,5159,4653,2310,861,2911,3962,3043,3282,1729,3282,1729,975,3578,3962,2911,861,1729,975,3578,722,3578,1927,38096,1474,2188,152,2967,3267,1729,3578,175,29,464,3283,607,373,50,2171,1927,607,3280,50,2171,3280,579,1055,239,3531,4586,3304,780,3339,3962,3962,861,3304,579,1055,3962,457,3962,1729,3578,579,1055,457,6577,295,39,2187,373,986,5386,4573,487,3819,1927,487,3819,487,3819,5427,4573,535,2486,4357,15036,5511,1927
+162,169,2266,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 6326,7908,691,2219,3930,153151,156,1672,378,6326,1836,156,349,2505,562,560,206,1720,41,206,7023,2963,501,2077,2968,6326,2181,3768,7908,691,2219,14970,397,773,3603,3458,3038,253,6326,14970,3475,3550,329,397,1200,415,535,14970,2077,6326,1599,27139,2243,5554,40299,42126,1996,110865,41193,2017,3328,867,67,1149,2966,2963,501,2077,3068,3076,35,14105,6326,4735,1877,2959,966,2181,2781,6326,2181,3768,14970,1826,2963,35,2077,3644,26978,6127,4735,1837,2077,14970,2077,869,1770,2889,312,6326,14970,2077,1877,533,1622,3234,1826,329,107,4586,1526,3645,14970,2077,3903,2963,2219,2219,6358,9641,755,501,2229,2229,10430,768,9030,533,1748,793,8864,279,3307,538,3967,2963,2219,104471,2929,5523,16263,603,2219,18567,2963,501,7100,7100,14970,14970,3857,34822,1424,6783,501,533,2366,1008,3532,101,7146,3537,3043,2963,2219,278,1109,14970,124,3204,5564,1877,6326,1599,27139,343,355,7908,691,2219,34822,3115,278,1109,1599,27139,3234,6171,533,2366,2388,124,103,535,4274,1200,415,1111,3237,1770,3202,3456,2366,4878,1037,6326,6326,2316,3834,49940,43,9,10,271,1843,1519,9,10,6326,6303,6355,1512,1832,487,3096,2211,487,92605,1832,764,3597,2560,36601,43,535,4108,1245,35,3343,487,6367,487,101,2269,1772,2922,175,533,2366,90706,1671,1712,36601,1512,487,207,5832,2896,2560,3872,578,966,524,7741,3003,6326,764,29594,1959,6248,6326,1959,6303,156,37134,693,66053,4586,110866,5511,535,1164,58177,1524,6528,6326,718,13819,13820,1822,17542,319,711,17081,2211,764,7166,1512,3471,2505,6326,966,1424,43,3861,796,3783,1623,2992,562,795,4548,6326,1836,3170,1672,6090,12031,1672,104,764,562,6326,2316,3204,206,1329,41,206,3015,206,562,6326,378,1672,156,19799,14904,1672,1672,136,1672,636,1832,1519,6326,722,3015,2144,1436,156,3757,2119,3265,2366,533,2366,278,1109,397,107,764,1826,278,1109,7908,691,2219,34822,6326,6326,14712,25049,156,1672,378,6326,1836,36601,1672,225,2269,693,1755,14216,1790,574,38708,3234,3452,4392,5034,1754,487,2462,319,4195,442,202,796,6326,3757,31141,1672,1836,6326,2206,6326,6326,36601,4254,2963,2077,562,6326,3068,764,41,1843,6326,3092,12107,2229,3653,3014,2229,1240,13632,414,2722,611,1950,1672,603,215,764,7023,6326,35,124,35,3471,2059,32322,2963,2077,2059,4628,32407,1836,4032,35,3471,41532,3076,124,4218,3280,1795,2959,966,2181,312,3076,2059,41532,3548,4735,1837,4735,1877,2077,2181,3548,4735,1837,2229,4598,3456,2077,2977,2077,3227,3076,14105,1877,2181,574,575,3644,2181,26978,574,575,1060,206,693,12708,193,13675
+1590,711,1023,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1933,26878,14738,4113,2470,796,212,393,2273,2794,610,1693,2211,934,977,179,4249,1693,6103,264,452,645,67,1826,81,839,1693,1826,4630,1960,930,3881,3914,1826,40,851,4225,4549,3841,1594,1693,2566,82225,3768,13763,1594,25029,1199,1321,977,179,610,1693,67,37,1693,212,3567,58984,1641,6663,58984,3466,1641,834,1065,2322,1141,212,393,2273,2794,610,1693,6806,741,15443,212,3930,1933,26878,14738,30500,1023,26878,2479,54281,54282,54283,54283,82013,54503,82014,82014,4187,22767,62840,82015,82016,82016,1472,27176,54408,82017,22767,27176,54408,56233,2839,22767,27176,54408,82018,27913,27176,54408,82019,20059,27176,54408,82020,26970,27176,54408,59047,2479,10657,27176,54408,72875,72875,1145,26731,27176,82021,12973,12973,233,26731,27176,82021,82022,82023,27176,82024,13182,28731,27176,82024,82025,1145,14500,27176,82024,82026,82027,27176,82024,82028,3118,15212,27176,82029,82030,1610,1265,27176,82031,82032,82033,1145,1265,27176,82032,82032,5045,27176,82034,54476,1145,4187,27176,82034,16053,16053,756,27176,82035,82036,1145,17028,37,27176,54279,82037,66331,27176,54279,59027,59027,1107,27176,54279,82038,1596,413,37,27176,54279,82039,9975,27169,54411,82040,82041,2899,37,55746,259,27169,54411,23197,2479,82042,82043,82044,37894,5354,2341,55787,55788,82045,1145,1265,64009,82046,32648,32648,978,82047,82048,58612,7149,978,82047,82048,82049,2929,16669,2341,82046,82050,82050,233,16669,2341,82046,82051,19291,42336,55777,756,2341,42336,82052,82053,1145,54367,2341,42336,82054,27687,2341,42336,42398,1596,54367,2341,42336,42496,2578,2341,42336,82055,3586,229,2001,4374,14738,3834,32690,2710,82095,54348,3834,2782,2710,82096,82097,82097,22767,2710,82092,82098,2479,3224,2710,82099,99,99,28372,2710,52317,52318,3834,81,2710,54415,82100,28167,81,2710,54415,82101,82102,24144,2821,2710,82103,55980,82104,4187,14597,2501,55785,55786,54841,2479,19252,27694,2710,68728,22528,22528,24144,7704,27694,2710,68728,56334,56334,1145,8080,1380,54277,76214,82105,3063,55746,82056,10909,2899,37,55746,82057,56074,72867,55746,82057,82058,1145,5464,55746,82057,82059,82059,5940,5335,1380,82060,65091,15117,1023,9678,82061,30500,1023,82062,59337,1145,711,1023,42314,82063,82063,839,17288,711,1023,42314,82063,82064,1590,711,1023,42314,82065,65812,1145,1540,1023,82066,82067,82067,24144,1540,1023,82066,82067,82068,1145,67620,1023,82066,82069,82069,2479,65809,1023,65807,65808,65808,2479,9998,65809,1023,65807,10920,10920,11767,65809,1023,65807,82070,82071,65809,1023,65807,2479,7063,1023,65807,82072,82072,1145,7063,1023,65807,82072,82073,2479,59044,1023,59045,59046,2479,7704,489,1023,1130,82074,82074,1145,27360,1023,82075,20018,82076,48,15810,1023,82077,56017,54659,2479,15810,1023,82077,56017,56017,1882,7759,82078,42071,42071,2839,7759,82078,42071,4625
+1548,873,1589,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2744,1043,377,2744,1043,377,187,117961,491,1043,377,2952,1048,271,187,117961,491,1043,377,3014,1043,2176,2968,377,1330,187,117961,491,1043,377,491,490,1043,2176,3930,24824,8807,21379,2744,1938,2814,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+165,1402,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 7023,165,1402,2696,2508,3158,29623,2215,2814,377,81,1335,940,2470,2470,186,165,67,3734,4113,3516,7816,3466,3310,546,1796,273,141,1632,554,2470,273,1632,554,3734,4113,3516,7816,3466,3310,103,2850,546,2850,343,2850,5472,5385,2681,773,3570,773,103,1597,9306,4134,50,660,1179,1180,529,839,47163,543,15219,28313,1496,4451,1796,546,24499,6693,3477,5385,4859,546,4859,343,802,165,717,165,959,2467,1631,297,1631,1631,1887,782,1570,3371,20591,4347,92511,1631,95,20328,529,346,47163,14162,1813,20328,2566,3273,773,165,1526,5131,3773,1973,165,643,802,1526,5896,1960,92512,5072,490,2579,490,3082,39563,10169,1065,4851,2322,371,92512,435,4878,101,3841,2566,2211,1524,3039,3570,5131,773,7023,165,1402,2696,2508,7023,165,21648,1676,2508,1012,13881,4878,101,14345,546,1631,711,165,1388,103,2850,103,1597,543,1179,1631,165,1526,2211,343,165,452,28313,1496,165,1796,2322,3419,165,757,28313,1496,8032,13881,4685,2215,2814,403,1796,2176,3496,4016,1048,5568,1048,5569,3522,3158,44168,2215,2814,13881,101,21585,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+206,207,208,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 9,10,1196,1247,2479,10974,271,300,6894,49815,1372,33169,13049,11506,4087,931,154,3451,8052,10099,33,20093,20093,770,1524,20093,6193,1548,1612,494,735,271,300,10155,2238,2238,15231,1184,2811,10,2479,1196,271,300,7543,12758,2936,6193,51010,1874,735,271,300,8052,48988,10155,3252,3705,154,1780,1196,1372,8060,1679,33169,5585,3475,3547,1833,931,8052,4087,6166,931,1737,154,1990,1877,10155,1780,4043,1877,620,1703,10155,1737,4087,1488,3696,1703,3310,4357,3942,3488,221,1679,1755,10155,3573,7046,7491,11795,664,3488,1488,221,1679,3705,8304,3942,4357,3308,1755,4043,3547,10155,3310,3556,3488,221,1679,3696,7046,3475,3573,332,114,10155,4357,2898,1329,175,1488,6127,1423,827,2028,15,5174,730,457,2774,730,764,1488,175,373,1329,2921,2774,2959,3245,11916,2292,730,7046,2602,296,252,2369,2558,7046,2313,1114,2028,89,5373,1866,6894,29443,2331,5072,6538,4542,89,207,1014,3695,208,633,1114,6100,10155,21124,2192,3876,163,5934,2369,567,3458,3488,1455,1755,3511,1755,3529,10155,221,1679,3620,7046,730,175,3529,2774,171,8808,207,1488,10155,11321,7187,175,10155,156,7646,208,43321,944,175,7046,5581,10155,403,3090,1284,784,501,3192,7046,3691,2028,3303,10155,711,5187,4850,6254,11326,1258,501,3303,1114,980,252,3204,2922,3685,9506,1671,5146,1789,60023,108141,85043,3287,1799,10457,4357,1180,2192,3947,2219,741,6140,4768,355,980,10155,805,8388,2438,3204,2357,2488,2438,10468,3030,795,252,796,4357,4220,312,1029,10440,3376,1222,741,10155,4755,6656,2206,741,3376,3756,10155,20499,10155,15663,741,38557,3638,501,4354,60023,11522,15663,73681,85043,4134,784,41414,3759,3638,10602,24,1789,38567,16,10155,294,1790,1790,1114,6715,10155,980,10155,413,4134,10906,5088,1789,11522,10906,1519,4358,41414,4052,1712,741,107,29096,12379,3756,3971,8643,1393,15663,809,487,10155,5312,6739,70210,162687,8774,166,252,10155,10799,11661,889,252,38660,1733,2488,3756,82383,4134,294,3638,107,12526,107,10524,3303,10384,4043,741,3829,11510,15663,1969,741,6683,12670,104,6348,10155,7000,2461,773,3014,10579,1354,980,2404,2846,10155,664,1060,1755,17230,15663,10155,206,1790,21096,48221,7176,741,3666,206,58284,7000,10155,15663,96407,217,944,741,1989,7208,69127,60023,7104,7800,13665,438,2857,3995,103763,980,73681,3638,1790,15663,10601,88583,7000,2353,24162,8324,60023,1755,229,2857,5237,13353,2331,1790,2857,7000,10632,10155,1755,759,1108,12526,1989,741,6333,10602,43120,229,741,1818,2353,4134,294,7026,15663,4235,11522,3550,207,217,752,634,3751,115,3898,6571,8337,208,6585,986,4052,3756,10155,13510,252,3030,15663,252,2488,664
+1399,23,1400,233,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3920,5254,1752,490,285,531,1400,2934,531,1400,3737,355,490,285,531,1400,1775,6167,397,6495,531,1400,343,91,452,3049,4256,2393,397,3625,4116,2934,506,375,10061,531,1400,343,91,452,3049,32797,530,758,20056,3329,59,839,6255,4129,27524,26785,5321,223,531,1400,343,91,452,3049,1956,73149,3530,32797,530,839,20056,555,28242,20056,2627,3254,3448,32797,530,758,20056,3329,59,839,6255,4129,27524,47254,223,415,6255,4129,46,32797,530,758,5551,3580,4543,20199,3522,21341,929,3522,4922,1045,4099,2321,856,17584,1933,116188,20265,4129,3790,6255,4129,96801,529,13838,7836,68593,7381,20056,5547,2929,20056,397,355,785,2794,610,3927,858,3207,7836,68593,77,2814,8247,11851,38916,2929,20056,397,355,25950,77,4989,23434,11851,77,2814,5038,3606,10527,1256,3557,1668,12592,96801,529,13838,531,1400,343,91,3586,3582,17584,1933,116188,20265,4129,18727,54511,121704,3790,6255,4129,18728,96801,13838,413,1668,17584,116188,20265,46,6317,349,5564,5871,20070,17364,5038,3606,711,26,660,3328,8847,20602,5871,3872,21337,96801,529,127,2161,1407,20070,17364,1594,3970,7298,6255,4129,10722,4647,711,26,96801,529,127,2161,21337,17257,3147,6255,116188,20265,4129,1407,6320,17584,88176,6255,4129,10722,1933,116188,20265,4129,96801,529,127,2161,21337,4172,26,127,2161,127,2161,21337,5150,17584,88176,442,16,17364,906,4429,4129,531,1400,343,91,4486,1509,5538,4099,26990,4989,273,944,4486,1509,4989,2814,4429,4129,54512,54771,938,4099,13185,531,1400,343,91,4134,28242,529,4057,4374,1970,4365,2001,4374,1990,4627,5323,46,8390,4406,11398,4922,4429,4129,567,4647,711,26,4410,4406,1597,17257,5765,4649,28242,529,8061,225,46,4429,4129,9509,1431,4851,5237,425,229,343,91,452,1045,452,6445,528,91,4989,273,944,3013,1047,397,107,4134,28242,529,2982,2983,442,16,4406,388,20268,420,5038,3495,1933,4693,46,4134,28242,529,13838,1149,6076,3658,132474,107,535,3568,17364,906,17257,435,2996,4429,4129,734,1329,3230,5343,4429,4129,4134,28242,13838,3568,1594,4057,5480,4429,4129,107,2028,2914,4470,46,1617,4529,528,529,13838,2927,107,4429,4129,2923,827,8192,17257,435,3030,5152,10912,46,5038,6606,47546,47546,3550,397,491,4134,28242,4225,271,6314,2553,4429,4129,46,2929,425,20675,6445,528,2927,3030,107,2028,1755,4429,4129,59,839,20268,8061,3866,442,16,906,3568,2996,4429,4129,2842,3043,4057,734,285,3861,796,13072,4429,4129,3565,3053,435,319,5874,456,1594,11740,795,796,660,3328,4429,4129,17257,4589,4315,2927,297,9391,6340,906,3759,827,889,5038,21219,4134,28242,529,1933,4693,46
+158,81,23,336,49,53,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 459,46975,8175,560,459,46975,8175,560,330,3496,2185,172,2746,274,2817,9294,2817,9294,2817,9294,2357,2817,8807,2854,3836,2854,68372,2817,9294,68372,2817,1330,8807,3836,2854,3419,2817,2817,4297,2817,4297,2817,9558,3836,2854,2817,8807,2817,13022,111088,2817,12994,24323,2817,9294,60054,2817,9294,21842,42871,12440,2817,3295,13055,571,330,560,2854,3419,3836,2854,3419,47836,2817,9294,40703,2817,9294,2817,2854,3836,2854,3419,2817,12994,92519,2817,8807,3836,3388,2817,3388,120020,2817,2817,8807,3836,2854,3419,2817,4730,20122,3836,9427,20122,2817,3295,1180,12994,2817,12994,2357,3836,2854,3419,2357,2817,3295,2817,13022,6408,687,2817,9294,4434,91,3836,2854,3419,4434,91,2817,13055,3836,2854,3419,2854,2817,3689,2817,3689,27830,755,3836,2854,3419,27830,755,2817,13055,52595,2817,9294,2817,9294,3836,2854,3419,105188,2817,9294,2817,8807,2817,8807,3836,2854,3419,2817,13022,119604,3836,2854,3419,119604,2817,3419,12994,2817,9294,2817,8807,3836,2854,3419,2817,13055,2817,4297,2817,8807,3836,2854,3419,2817,8807,23901,77,2814,46975,8175,560,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+273,201,2128,2425,466,1078,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2128,71,631,2322,3744,4176,631,17112,504,934,71,2128,631,2322,3744,4176,631,17112,504,1642,452,3451,2128,2366,2128,2691,1222,2348,273,221,1078,748,10281,1247,3724,2691,3724,2846,1247,4834,1042,21987,961,393,717,393,145,929,30,2951,1079,1221,1079,2794,67,4303,645,10390,10167,2322,631,2322,934,2176,626,3013,457,1321,631,1214,3962,2769,2322,1228,452,2322,5694,11527,975,1374,5488,461,5316,273,3744,1548,1549,856,11805,10288,1247,287,2058,376,93506,2560,929,10166,2322,229,1247,11793,623,11925,623,4087,3938,631,2322,9210,3050,2769,2128,738,1501,3207,2128,631,2322,4176,631,17112,504,1986,469,25856,4735,2347,3083,10215,5850,2149,631,2128,738,2466,4176,631,3106,152,17112,504,2891,9,10,4176,631,273,2128,738,3036,504,2886,631,5701,3234,3844,4938,2545,2951,3570,2974,6459,20837,29931,3036,1042,504,2886,631,1085,4150,3234,4176,2943,2908,2168,9,10,273,7413,2025,539,3784,1014,273,4639,2162,3784,2951,7288,764,457,563,435,2753,2049,3784,1597,2254,3749,271,2864,1139,6647,5972,17573,9881,6648,1730,8710,3814,202,469,7068,1755,273,9510,2864,457,13670,2090,5913,273,469,355,5699,3947,2025,4157,7280,1867,3844,1744,469,7068,6641,4336,2162,1668,2545,435,2090,2347,7288,469,7068,273,294,469,74,294,1477,703,5974,3029,2994,7280,452,1833,3333,294,1871,9,10,5479,469,3651,17715,3043,273,2162,3784,3856,273,9,10,570,966,21626,202,2162,2347,2545,2347,9,10,570,966,2367,571,101,58893,966,1087,622,966,120,6340,7280,452,469,7461,7068,4639,3784,11742,202,273,2162,2090,2347,1329,9,10,5184,1730,4132,469,7461,7068,2905,494,1008,343,494,1008,3494,3599,734,3503,10389,1455,2952,7280,100,2285,700,10389,7590,1008,413,494,223,2701,29,4496,623,2996,229,4496,623,3300,1735,4496,376,1823,2942,4496,623,1111,686,694,5949,958,2545,5949,1008,4901,764,1735,2808,11324,273,564,1008,1111,3478,10421,340,13718,15009,3147,3695,175,457,2952,7280,273,2545,435,3678,889,202,1329,3030,494,14289,10421,2232,9,10,16566,29,469,221,1141,3553,469,2975,1676,4837,9155,52,29,229,71,2254,273,846,3705,29,229,3034,4496,623,4928,7376,3967,5494,469,2951,273,1183,5949,5939,2951,3202,1971,2322,1986,34952,5168,535,2951,5949,1125,727,273,1761,1630,1985,504,273,2553,3202,856,100,2951,1581,2992,343,827,1139,564,1008,10115,4859,494,1008,93,5375,16870,1207,1660,4357,9,10,691,295,469,1008,273,4181,3269,856,11324,273,564,1008,958,3759,2968,2408,10337,1329,9,10,2648,4859
+1040,1041,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3,1040,1041,1530,760,229,71,1476,2566,1530,229,71,1216,4834,1042,852,3502,1476,2566,852,3502,1530,106,1128,4010,15,229,1037,1826,67,1026,229,5772,6498,1530,1037,2317,114471,1826,67,2316,2888,114471,3,1040,1041,5569,3522,1041,2295,2814,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+1774,49,1974,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1774,5050,496,287,533,986,1774,5050,496,26353,26631,3009,1737,3857,12445,2951,435,931,6690,5994,420,4491,2942,12445,906,6412,673,10798,320,3083,2953,3110,67,2968,2553,505,9,10,4401,26353,2746,4316,809,5215,505,26353,103,9447,26353,672,2316,2889,2077,6669,420,6082,353,26353,2974,1960,74,3608,12470,3495,223,74,2959,2366,5182,15,74,1160,5610,3453,1774,3009,1737,4536,3651,229,2896,2992,2998,46,2927,4536,223,1774,4254,3009,496,4181,2954,958,2899,355,7885,1774,3009,1737,6104,3013,6101,107,6337,378,1774,4254,3009,1737,958,139,491,862,106,1774,190,355,1129,1130,216,6097,1597,505,1774,2522,447,2206,491,3013,6337,107,26353,3544,371,773,6337,809,1774,3697,352,6101,15657,3658,773,3550,46,2927,107,21753,21754,170,1974,1774,4850,1043,2927,1774,67,355,3158,1160,2814,38468,6730,132961,3729,2992,7590,2970,1774,5476,940,1774,3071,259,343,4209,1774,397,9447,1774,3546,3261,2992,1774,4536,223,3651,33,4536,16709,5494,6337,809,3614,6337,1730,6101,355,7885,4536,26353,3684,1843,52,107,378,2896,15657,397,3658,31310,1774,2992,660,3202,355,6196,6101,397,3445,3907,26353,4401,505,1228,1960,6101,2896,3445,1354,1741,3907,505,26353,3009,1737,3329,441,442,505,26353,67,1160,223,361,3158,1160,2814,223,664,3158,1160,2814,223,2817,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+2152,1599,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 14227,2485,14227,2485,81688,2427,24060,8245,5787,4976,26428,1335,4357,6140,3226,259,5927,5502,2152,5,457,3790,101,2152,1744,2440,81688,2427,3834,3770,9565,3044,397,3013,1229,1744,397,2979,4498,6182,1216,22655,1264,3603,253,397,2983,3350,2427,81688,2440,3470,3548,4638,3514,3555,3939,2427,2152,1735,6080,1531,2152,2836,3350,2427,6140,1229,397,4023,2914,1424,2967,109,112,5979,2909,1423,1183,2427,3317,3681,3013,2914,1424,22655,81695,77038,77039,6167,2152,1735,2983,3939,2427,441,1149,10122,2152,2929,2427,2929,2427,2846,441,2427,2282,6097,3573,2152,2427,3558,3681,357,319,576,2366,413,3681,2152,2427,3537,3751,12838,816,24829,5317,3858,2929,2427,2886,2152,2427,4171,101,8343,2152,2152,4866,3038,330,2152,1735,2427,6113,4899,51437,81700,27310,31524,63779,81701,81702,2018,441,2913,2427,1676,2152,6335,5564,2152,2427,441,5260,5480,5979,506,2951,2152,1735,2864,808,2152,2427,3751,3103,2408,6113,475,2929,2427,2929,4866,330,1211,8289,81703,2427,3583,1843,3537,8391,4794,3537,2913,3757,2958,37683,2929,2427,3835,2152,4247,5590,3676,4424,3278,343,3235,2929,2114,7510,2152,6381,2292,6530,343,2672,52013,2427,2152,2836,2929,2427,397,1183,2427,2427,4628,2929,2152,3902,2152,2427,2929,1180,81704,375,2840,2929,2427,2152,1180,63431,81705,1047,2427,2929,2427,2270,2152,11437,12307,546,2427,25822,31003,3332,546,1599,2484,2152,2427,2270,2929,1766,5993,507,11554,2152,1735,6087,672,2427,2929,2152,13822,2672,3967,2427,3910,5979,3038,3609,2152,2427,2929,2427,2427,1143,3910,397,1755,2152,1735,3898,672,2929,2427,3096,3910,3866,4289,2049,13822,3910,475,2152,2427,81703,4794,5237,175,2440,2914,13822,441,672,2316,6113,2316,2889,3515,6070,2427,2152,1211,2029,1824,6196,5788,4794,100,2665,2282,2152,1735,1908,6525,2152,4247,163,3640,2152,6182,2929,2427,7366,2929,4794,1159,2152,6635,2114,3204,557,2152,764,32277,2152,5979,3586,3923,2929,2114,2152,2114,3844,2427,24060,8245,2896,1229,1744,397,2979,22655,2152,67,259,5927,5502,2152,1142,2296,26428,26428,30189,361,3158,26428,30189,3158,76986,6120,2814,76986,5530,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+52,107,36,129,315,794,8,1072,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 19344,1072,636,934,377,459,2211,1641,7103,2470,19344,934,67,2181,287,156,1597,459,1072,12378,67,1003,67,487,67,2136,67,533,3454,5511,852,7815,19344,533,67,355,1960,6697,19344,3533,25458,19344,67,533,1748,67,397,958,190,3522,278,1109,3651,5896,1335,5593,355,19344,934,67,2181,287,3914,1037,1072,636,695,3906,1072,636,113,1072,636,3834,1072,636,378,1072,636,206,2229,1519,1072,636,2077,2968,3834,1072,636,2159,1832,1859,1072,636,5385,1072,636,846,2316,2229,361,253,10427,23870,3773,2229,361,4740,1516,33,834,33,1142,3207,3039,1871,67,2030,1516,780,3553,1516,3295,3295,1516,1516,1072,636,1072,636,349,1072,4607,1455,1823,487,693,4218,203,1823,3547,206,8098,1072,986,8656,1793,156,796,1072,636,3328,13519,2454,2369,1072,1014,3326,1072,13519,2369,1072,636,4218,2992,4692,1329,1072,4812,4607,1823,1455,2058,2969,764,2400,784,206,3565,1329,1072,4850,5323,3015,784,3558,1823,3511,1072,1031,3484,4607,1823,3511,1423,203,3494,1072,636,3030,1072,1660,156,5037,1072,7342,784,3614,1950,1832,442,1969,5050,41,560,1072,636,2635,1832,442,1969,7023,1072,636,11960,6974,1014,4199,11747,2313,2077,1111,764,3108,759,7170,560,1072,636,18414,3015,533,986,312,3445,4738,1574,795,2181,2119,2366,6656,3653,2945,3556,2077,113,1072,636,796,25169,1072,636,535,3609,2181,1072,636,3799,10421,14284,1818,4003,784,349,2181,413,2913,3681,1072,636,3681,206,575,6400,2181,2181,413,3681,8327,1072,636,349,1072,1455,3011,6715,1072,1823,2171,4506,6332,1620,487,7157,487,4054,1072,1003,295,378,1818,5540,1003,784,2888,14017,10421,8326,1072,636,349,1072,986,7761,1072,3284,5062,487,217,5180,4607,1455,6259,560,3108,1818,10024,4529,1673,24,1114,2181,1003,10421,3834,1072,636,2960,259,1072,636,271,1843,1519,784,4861,3834,5917,147,4022,3834,478,259,6531,1072,636,378,1436,5881,2665,1436,1436,809,3910,1072,636,4632,966,1436,809,8656,1072,156,3800,966,734,1072,636,6947,4022,827,478,259,6531,1423,1424,3835,1072,636,3764,5100,533,986,5366,2162,2029,46,764,1574,795,764,1423,1330,2168,4747,3764,6117,46,2560,1072,636,1730,1423,784,794,966,764,1423,966,764,1423,378,1072,636,229,1072,4607,487,1823,1455,2273,3755,1423,1143,2665,3108,5564,442,4365,203,1823,1014,206,8098,1072,156,1072,636,2945,475,100,2560,2665,8656,1072,156,2099,827,871,889,8628,3016,827,487,828,115,2793,487,166,889,1188,1832,2029,3654,2560,2665,294,2560,2992,18774,1072,156,1072,636,5865,2560,2665,8628,827
+720,2097,371,15,1196,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 834,1228,2023,274,98,1065,4851,720,2097,6185,15,3681,15,1141,978,757,720,2097,2005,1501,2211,1832,285,1012,2579,4118,4221,452,3194,505,4391,435,386,2156,388,1423,3227,505,3756,320,5809,8014,506,3471,5488,295,15,295,98,1065,4851,3158,2005,2814,1432,834,452,159109,98,10934,28,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+1022,1023,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 28983,4953,4224,1022,591,215,3620,21416,2176,3897,535,19742,3881,4921,19742,5779,19742,4322,4019,3494,3445,19742,3567,9,10,393,668,1335,975,1043,3962,2211,287,2211,3215,3158,26361,9060,1321,3536,3836,402,452,50,2171,2470,1335,975,28983,4953,4224,1022,591,215,3620,21416,3841,20027,975,18776,28976,930,24060,23435,980,1214,25070,2472,355,28976,930,9876,1979,1790,4953,4224,1022,4390,4032,21416,48773,50,2927,2007,2934,591,215,3620,21416,3112,9,10,5940,1469,2908,2701,13592,215,13592,3013,3620,21416,704,4504,16989,4461,36066,3254,413,71,3514,215,6339,13592,6969,491,4064,5934,4851,3026,21535,24969,21535,2669,48773,26361,975,9106,25070,1029,8732,50,2171,9431,6424,3954,2296,1516,3930,4297,377,81,5569,154,5313,4017,4171,5568,1043,3522,28768,2211,1335,26361,1335,2871,3011,1859,14529,975,3304,2501,3744,3742,26361,10381,259,3112,1335,3618,643,522,2974,773,26361,2470,1335,1335,1887,1335,1524,3039,1335,867,26361,934,26361,26361,3618,26361,1321,26361,975,26361,3734,2794,26361,3914,26361,2470,26361,377,26361,2974,8673,3742,26361,13178,540,542,3158,5465,2814,975,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+992,130,808,348,23,2004,2005,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 348,157,490,348,157,348,16,157,2929,3043,157,17871,3751,271,23880,53,348,348,435,3678,5189,11445,3553,1014,349,2479,3043,229,3311,531,99,2231,3118,1761,348,349,4134,1405,4851,3311,271,23880,5890,2316,3494,5593,16,3611,8295,1391,11445,3018,11036,3496,84429,687,10863,2029,3638,435,1229,1033,1229,2292,435,17871,1827,2960,1229,1033,2960,1229,443,456,1761,348,5261,46,14331,5052,3281,157,1610,53,2316,6686,4401,435,7188,2589,29425,4024,25875,13803,1878,4232,1391,29104,2316,3010,29425,1351,78729,839,157,839,1033,3843,1033,10066,28886,1720,1673,2944,4034,773,3189,7023,348,8295,7894,4401,2004,3281,2929,157,11445,773,3885,5237,11467,5335,4696,14331,4442,4019,10072,2292,6331,435,1229,1033,2960,1229,11445,3751,6331,14469,378,6342,11198,2192,443,5888,6331,2455,1976,4016,378,1155,2853,14331,14469,8295,6122,4019,13776,57915,1431,15048,15252,4258,2004,3678,3553,443,2922,348,5335,14331,4696,764,22215,8295,6122,3751,11445,355,14469,332,6331,435,1229,1033,1229,2479,157,413,11445,6331,3281,38818,3745,60329,1155,4442,14331,8295,7890,1143,3982,11198,1264,717,1125,1986,273,25104,8123,1608,371,8402,4617,1155,3495,33462,10019,764,13943,3678,6606,3749,2853,3063,1843,13766,348,1405,192,4851,378,443,157,598,6335,54209,598,14331,4442,8295,7890,6331,435,3586,2286,2190,157,443,3110,18384,4019,27533,10072,13776,2004,435,764,15735,1354,5051,5934,2465,8205,2942,2325,82619,1431,4258,11445,6331,1481,951,336,1610,1405,53,435,1229,1033,1229,14218,435,2929,157,4401,4645,3751,348,355,3311,27868,4016,1314,3565,8402,27868,1976,5313,8295,6122,9048,6331,21273,2493,10616,33462,11445,6331,54078,62570,2004,28370,2097,1269,56386,54078,355,7031,2922,3734,773,3317,1314,12032,2926,3495,348,6331,3484,1832,43690,8295,6122,6331,36431,99390,11104,24872,6331,764,348,355,3311,598,157,2231,3311,36431,15735,3780,3189,3295,11445,3812,4019,443,18544,5335,36431,6331,8295,6122,2292,6331,435,2966,336,1610,4482,1229,1033,1229,1354,5051,11445,332,6331,36431,8295,6122,18544,4696,934,27546,2493,8123,13606,773,1976,6331,28484,53,5189,443,349,27868,3189,348,14331,5335,4696,8295,6122,15735,27868,3734,773,3780,980,934,9048,11445,6331,598,53,413,1976,3885,6331,4761,435,2479,157,5462,1481,1610,531,99,1130,4357,14469,11445,6331,3484,11198,8295,6122,76276,18384,13776,3812,3745,17871,5333,861,4442,18544,5052,5335,2292,6331,435,4482,2959,1229,1033,1229,348,10328,3068,74531,8844,2913,11445,24872,349,98,14469,3043,74531,8844,6140,6331,435,1229,1033,1229,3611,8295,2913,11445,378,5189,443,8295,6122,1420,2479,157,738
+1370,1371,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2283,1371,2776,2206,16,1371,2776,2566,1176,2794,2206,16,10352,834,2794,975,2254,2314,1180,2776,1371,273,271,300,1634,832,4134,271,300,955,1968,29,2776,355,3189,832,2881,2025,3875,2960,1176,33,3763,12818,1176,832,11462,13990,271,1986,1746,1391,826,2769,1072,320,355,5586,271,221,4248,2776,1634,832,1014,4850,13967,832,3287,535,6355,7380,69450,2776,8041,452,2952,40,16072,1634,832,8105,4782,437,16811,3509,4442,27510,3640,6697,4294,377,1634,832,4203,287,1371,259,2776,2316,2953,1634,832,3334,229,5263,2234,271,300,271,615,7741,125646,15657,2426,79163,5942,271,300,104,3766,2674,1176,5160,511,466,1125,2300,1055,736,3403,4627,18484,4902,271,300,79163,1755,4356,120,466,2861,546,3617,4850,4108,14162,15078,3348,17958,18069,442,31,17806,1748,239,535,6418,3303,20403,2891,2558,2674,939,1329,79163,12299,5861,2423,114114,1597,1370,442,1176,3334,79163,2423,17958,18069,3246,3601,10262,287,5206,12414,7278,15933,1574,1597,3445,5861,3914,3860,7170,79163,3776,4937,14887,343,100,6649,4036,1370,30,4937,3445,22355,1597,2753,287,91,15884,3348,2975,15,2890,3348,12438,2709,1597,1111,2753,2982,1574,3761,7597,12818,271,1176,271,300,6140,4647,55596,3660,1126,4285,155629,832,271,300,979,3554,25147,1761,287,14379,271,300,273,8105,438,2398,735,3048,15,7121,18317,1979,46689,1127,7468,57228,16185,5062,50,373,4348,2013,3698,3539,7644,764,1144,764,9,10,4902,2987,14626,33518,3660,1080,2092,4428,2440,2888,1503,4998,539,9007,8473,36110,259,37,2603,176074,1144,271,300,2423,7925,3371,1371,273,271,300,7925,3443,1176,259,259,2270,25800,522,3651,271,300,273,393,67,4303,3325,934,2283,2814,934,2176,631,2322,273,1216,452,1335,8297,273,442,2211,2470,3158,2283,2814,3836,3836,8926,1280,1371,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+847,848,156,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2213,223,4017,2566,2213,223,4017,2566,438,2566,71,2213,377,438,2213,67,377,2077,67,3233,1409,156,13778,848,18723,84659,38835,6347,58600,41901,73826,112,1409,2213,67,6083,6139,5917,1409,533,67,30945,6346,6326,913,1079,32000,1836,14083,38832,1112,67404,67405,58651,58652,95685,8869,31137,156,18455,73477,4676,25270,1046,38836,71,2213,377,1160,343,139,67,3651,3158,47161,2117,760,2470,1887,1160,1513,297,5962,5705,773,1037,1387,1160,2213,2077,1161,3158,1160,2814,82789,82784,2213,36903,1161,2077,3729,3540,312,2213,610,2213,139,3158,1160,2814,82789,82784,95722,3836,355,156,52,139,343,355,474,2213,6236,139,610,2213,139,438,2213,67,377,259,931,533,2886,3158,82785,2117,3449,2369,1959,6303,156,2213,5034,3755,2996,2206,1228,66498,1734,852,67,2566,377,3038,26691,1959,6303,156,3158,26691,533,2117,6390,2144,2213,2213,3836,67,2566,13760,377,4587,3999,16717,3158,3999,2117,2213,3836,764,3090,6031,4568,4610,2983,67,206,2077,3834,2213,7912,533,3158,173590,2117,1761,6077,67,1734,2213,6740,2213,67,355,3158,30114,3200,2117,2974,2213,2213,3729,4241,501,397,1029,5790,106,2213,397,3158,1888,67906,6652,3729,3582,67,139,6585,2077,2316,3834,1959,6303,156,1761,2566,1734,1388,25177,2206,1362,3158,25178,2117,555,17182,555,21972,22415,533,514,1959,533,57951,3158,2117,2213,2316,5248,1959,533,67,2023,3353,3525,67,2213,1959,986,1641,2982,5832,3083,1668,26322,1968,25465,3106,1959,6303,43,1037,3158,95719,2117,30115,3729,3809,67,4641,856,6451,87547,3158,87547,2117,87547,2992,2549,6380,67,3814,5248,1960,16717,3023,1790,2996,163,3779,1959,5207,56617,13290,14832,2213,3158,56617,1474,2213,459,3836,625,3854,648,139,2077,1959,6303,156,2077,67,1161,2077,1959,6303,156,1160,3158,1160,2814,2213,2077,3883,3729,4989,8525,371,1959,6303,156,278,3532,1161,3215,1078,425,6652,3836,13778,13778,355,156,52,139,1160,3158,1160,2814,13876,37105,26789,13778,3883,3729,848,18723,848,73838,259,931,533,2886,3158,82785,2117,99986,6910,3836,848,18723,173590,3158,173590,2117,12910,8744,3836,848,18723,1037,1387,343,4031,533,3158,12870,269,2814,14557,99981,3729,848,18723,343,73838,2886,3158,1474,18723,3836,84659,84659,43,355,156,52,139,1160,3158,1160,2814,13876,37105,26789,65676,84659,3729,38835,38835,1037,259,3071,533,2886,3158,82785,2117,99986,38835,3836,38835,1037,741,8966,3158,134041,1474,1597,7451,706,3729,38835,1037,1387,343,4031,533,1037,1387,3158,12870,269,2814,14557,154520,3729,7898,3332,501,1881,38835,3158,11065,269,2814,1880,7451,706,3729,6347,6347,1037,259,931,533,2886
+332,533,2400,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 175,442,223,3667,271,3867,1216,271,4878,459,3563,1552,79,929,1079,1652,120,1877,4549,1775,934,138845,3667,1752,26885,3273,1970,343,26885,67,2566,3565,3348,2168,4137,2322,4342,929,21538,3553,2794,343,26885,461,1676,373,257,1654,1284,461,4006,3744,343,533,26885,1284,2566,3233,533,26885,343,355,2439,139,52,2439,4254,343,533,26885,67,1746,26885,3027,2211,9607,154515,21538,2814,4730,3689,9427,12994,13022,13055,9294,5485,3388,4297,2854,3189,8643,533,2400,1795,332,24939,2358,10384,139,1795,343,2358,10384,139,1795,343,752,2366,1795,343,41791,2400,1795,343,6246,1795,343,2012,487,488,1795,2614,4998,3419,2699,604,664,259,1072,1795,49030,578,6254,2400,1795,1882,16,1795,343,505,2323,533,1795,2274,296,2400,1795,12658,533,1735,1795,147,1072,533,343,4459,2400,343,1735,751,1535,1156,343,3176,147,5525,343,353,5944,1526,2400,343,505,20597,1072,30993,2400,3651,332,259,4187,4905,1795,1175,259,4866,1795,495,7469,2400,1795,343,562,89,448,2400,1795,343,24966,8330,136,2400,1795,343,752,488,1795,343,635,1795,343,392,1795,343,931,175,1795,2274,296,2400,1795,21783,1526,1795,4162,752,533,1526,147,16,1795,6254,343,15,13663,14017,1156,2438,2400,343,4576,139,343,32463,4576,2400,539,17470,259,115,5958,2046,611,2400,1795,136,52,1795,6193,2400,1795,2529,2620,2723,448,2400,1795,343,1774,2400,1795,343,353,2084,139,1795,343,12796,1795,343,1781,124,1795,343,2213,2400,1795,343,1432,5525,1526,1795,1959,4981,2400,1795,147,752,533,1526,1795,343,2136,2400,343,287,533,4156,28059,611,780,4633,539,533,3844,1986,1526,2149,353,5774,2699,901,343,678,8340,343,2918,136,2400,343,2269,10527,488,2400,343,223,15884,1526,2119,3175,175,5809,259,2852,1615,2400,1795,2982,1488,3744,1795,2982,2136,1795,24888,4610,1795,898,50,1795,3235,28616,1795,6326,2400,1795,1931,156,2400,1795,1638,156,2400,1795,495,533,1795,12537,40650,2886,1816,85,343,8346,1795,343,14654,156,2400,1795,343,2206,1795,343,827,487,828,1960,1795,343,40533,576,136,8751,139,1795,343,73540,1795,343,25513,139,1795,343,14875,4085,1795,21270,2400,934,752,1526,343,9314,2400,1795,343,1958,829,139,1795,343,7274,2400,1795,1330,259,1795,31158,2328,1795,793,4008,5525,1795,576,136,2400,1795,38960,208,2400,1795,343,57,496,1741,343,10392,3003,3096,2162,726,319,1615,2400,343,1770,901,343,956,2400,60,73,2400,343,57,496,1741,343,466,3844,562,89,448,97561,2400,343,611,35,4254,2358,10384,343,4921,4008,343,147,533
+898,164,621,899,772,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 930,2689,24928,8140,930,2689,24928,8140,76700,3857,930,899,287,899,7801,899,3581,9114,38480,76701,899,899,38480,271,9114,9655,899,899,4304,898,9114,2913,899,9114,5540,9655,271,899,96778,76474,10174,4218,3745,514,4247,4814,930,8591,2967,8140,3666,2501,2501,295,2501,3841,2688,3954,105377,44313,2814,44313,3456,44313,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+1412,1,1413,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1494,139,1960,397,355,2922,7664,583,729,29,2485,2691,10908,1018,14537,6277,425,426,2977,13730,3043,2366,1412,1567,3536,13102,583,3025,251,5484,29,2485,2691,5382,6095,2485,299,1567,2366,1412,18371,7653,35048,4533,7280,2366,1412,1567,1567,1409,3536,475,2366,1412,1567,2942,3698,3466,773,1494,139,1413,2366,2864,6067,7077,1748,5251,898,3909,773,2967,1567,5036,8376,119923,107,3246,1258,1257,3501,3701,7077,1748,5251,898,5088,1748,5251,898,7483,898,1720,1413,3280,4288,4290,3550,6171,3536,3526,3698,3310,5993,5073,4150,1567,3328,2029,3703,1567,3536,555,2914,3043,555,555,172,3703,2134,2134,555,2029,1746,5167,3322,2109,5251,898,1746,1969,2109,5251,898,5167,5251,898,1413,5610,2963,1748,7281,3322,1409,5167,3322,1524,2326,3322,535,1748,5251,4290,2781,2029,5167,3043,1748,898,320,5167,4589,1413,5251,898,4288,898,2316,1748,5251,4290,898,1720,1413,4288,898,376,2326,3322,5167,113,1413,1524,21946,14090,2134,555,2029,567,7799,3870,1413,1970,4403,1412,2781,2029,103,4290,4288,898,3322,5251,898,1413,1412,4288,898,4288,898,2235,10473,3444,4392,5251,898,567,1413,3123,7799,3870,4403,2366,1412,4290,3583,67,5251,898,1413,567,7799,3870,1748,5251,898,1412,1413,163,1412,1413,3821,1413,1412,4288,898,2881,5871,3271,1412,1413,1748,5251,898,1748,4290,6480,7799,3870,1413,1149,2889,4789,596,5251,898,4288,898,1413,2029,567,1413,1748,5251,898,3123,1748,5251,898,778,934,7656,2781,2029,14332,1413,1381,8343,1412,1413,4288,898,1413,1748,5251,898,1413,1381,1748,5251,898,3701,6957,3898,2119,1413,1748,5251,4290,1413,1748,5251,898,778,1668,934,13797,1413,567,1413,1748,5251,898,1412,2753,9160,6862,4290,1748,5251,898,3322,1748,5251,4290,5251,898,1413,1412,4288,898,452,1413,10374,2366,1412,5064,1622,2967,3333,5297,1413,1449,1524,2339,4554,986,2009,3192,898,1413,3503,3123,1748,5251,898,1412,1413,1412,1748,5251,898,2254,3842,3333,3807,1748,5251,898,2522,1748,5251,4290,3333,2927,163,4290,5564,5064,1622,6639,1567,3043,2331,2476,3549,2522,59612,535,567,1668,934,7656,1413,1748,5251,898,3123,1748,5251,898,1412,1730,4738,1413,4288,898,5881,535,59612,2522,2781,2691,3703,2134,1567,567,5251,898,778,555,8282,3703,1567,7497,2781,5236,1748,5251,898,271,4303,3565,6072,2968,1748,5251,898,795,271,4303,1748,5251,898,1729,1703,3544,1329,1730,1143,5251,898,431,2339,13702,2339,3792,1744,4752,3967,2968,5251,898,1748,5251,898,19342,6317,3565,3764,5934,2942,2316,3494,5871,4288,4290,1746,5820,5251,898,4303,4288,898,4288,898,2366,1412,372,2781
+62,749,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1541,435,79862,79862,749,79862,749,100,979,5556,62,5431,20150,529,41873,2097,955,3874,1541,435,3351,413,29109,3771,2968,452,10640,435,1131,29109,5217,892,29109,344,3553,67,79862,1755,79862,9360,1043,377,3258,2211,9360,3735,13955,2945,4019,3158,2476,2814,5092,79862,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+1420,201,1699,271,409,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1029,1699,5569,3648,5313,369,3954,5014,29213,343,5312,3223,3224,29213,45,1611,1524,3039,30828,2814,1501,3207,397,4491,6959,14148,3758,1754,18206,1254,3495,12190,2927,30829,5564,30830,11620,1754,437,827,828,18206,6661,6971,3002,2024,27670,229,10384,7551,437,30831,1754,2467,650,5969,1029,1699,1214,30832,610,30828,103,1424,4484,267,4826,3343,8726,18206,106,214,18359,5538,3457,18206,8373,106,2558,9621,618,271,1254,3495,2927,870,267,1354,4549,1029,3942,397,1086,240,5395,329,5312,106,2104,175,267,2325,2987,3942,5763,397,1355,1086,1128,1372,4039,106,630,175,25835,11289,3495,18039,12876,2872,30828,1029,6100,827,828,18206,397,27670,229,6971,3002,30833,437,10617,267,2316,2953,1111,2992,30831,1754,2467,397,30828,7551,437,267,3834,3934,397,3919,12190,10194,3294,793,437,557,1754,3269,1029,2992,8334,870,1856,12190,2927,30829,5564,1391,687,30830,11620,267,4826,2927,7904,2567,7187,4901,3317,1703,30647,3742,870,16118,30830,30831,11620,175,610,1029,3343,4302,396,2282,7885,2954,4010,7885,1754,490,3516,4930,12190,2927,30830,11620,1754,437,3002,267,6755,1699,6760,2977,30834,8001,30835,9226,9679,11020,30836,3758,2292,394,2927,95,3495,2287,1524,30837,8722,9008,30838,6755,1699,9065,30839,11020,8156,5338,30829,5564,3002,267,30840,4901,5494,1799,6755,1699,30839,11020,8156,5338,26,828,6971,1711,14728,6755,1699,9000,30841,11020,8156,30842,3112,2024,30843,3002,267,1843,107,18676,6755,1699,11020,8156,5338,30829,5564,3002,267,2325,6755,1699,1998,11020,8156,11600,2567,7187,30844,8839,30845,4901,5581,3002,267,30829,5564,6755,1699,11020,8156,267,4826,14148,3758,18206,18206,9265,9106,30828,602,1757,1524,30834,3930,30846,1043,8156,3158,11020,30828,2814,397,267,4826,764,1699,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+46,103,1611,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 552,553,5530,21799,3921,1513,5327,672,3334,3758,4482,3622,9471,7001,5530,664,6167,1676,622,623,8156,21507,2176,29,809,7199,29,809,7199,29,795,796,809,795,796,1528,809,3448,555,555,554,695,1264,809,664,8156,21507,2176,21710,1871,459,393,12781,3308,3926,1087,334,1871,459,3539,535,393,12781,2921,3062,1338,1338,870,2672,1338,623,1329,1969,3909,3308,3448,3997,623,50,469,3523,4838,671,623,1827,6117,207,6117,571,469,3684,1969,2946,700,3488,5313,2176,3037,1871,3254,21828,5313,2974,3523,456,457,3210,1856,3037,1871,3254,5313,2176,5313,4143,374,452,1676,299,216,535,1639,3442,7348,2522,5,623,2722,10490,2648,7891,622,2942,5313,3310,287,3536,2553,2077,1639,3442,7348,7891,1528,940,5469,2176,1970,5236,940,7322,14,6643,3504,623,8156,10153,2176,2946,700,3523,1284,1970,2946,700,3857,555,1524,554,5313,2176,578,622,30,623,772,3780,46,2909,10,14103,3448,3614,3667,229,30,772,1313,555,554,14,1014,2866,3852,2631,555,3550,5426,3684,2176,5469,12197,6916,3684,2176,393,374,552,553,452,3449,452,3448,552,553,452,2549,3265,1620,623,553,1827,1477,2881,287,7597,3445,441,101,452,560,5551,7725,3597,768,287,4772,7368,7289,2534,2228,5338,552,553,623,3451,3452,552,553,452,3446,552,553,554,623,3522,2589,553,3620,2232,3736,2675,452,3123,3522,3235,589,221,5384,2232,3614,3613,5862,2909,554,5449,944,39,3448,5384,3529,175,2534,10305,5551,71,3210,2025,3841,1072,3451,7001,554,5279,1832,452,3338,2675,8116,221,3768,1826,6297,5862,3584,6676,3717,21802,3169,6629,3581,553,553,3284,3581,10387,589,6297,5862,3241,452,5279,589,3446,221,3613,7589,5551,1676,2589,2461,851,8554,10903,2485,3448,104,2461,851,21803,2589,21804,1676,3234,2366,215,2589,1676,3038,1247,3717,1086,10104,3453,452,1086,3451,3613,14565,3013,1309,3686,1761,3226,21807,3768,21808,3613,16591,221,1431,3451,14565,567,2867,221,21809,1660,21810,623,11289,1651,3440,552,553,5530,9471,7283,4087,552,553,4143,1042,4972,3523,552,553,452,9511,374,3705,3441,5003,623,1893,3493,1247,3705,2235,438,1581,2863,5483,1856,10061,3348,8673,3663,5530,3906,4403,1716,2720,7395,6361,5530,3324,2030,1516,3663,3522,452,2863,5530,6260,4972,3583,3814,6972,1703,623,221,4972,11877,11754,3496,6095,3666,2863,5530,2863,4972,589,12121,3586,3523,3524,7183,3758,552,929,2863,2228,552,3532,3523,794,148,2675,3210,2863,553,4972,2168,3551,452,1703,221,6377,1037,229,553,4972,2927,1086,3280,4972,3210,4010,5615,452,186,40,672,4006,67,3239,1716,10174,216
+1366,540,1367,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2232,2322,3724,2232,3492,8899,11796,3308,934,1249,6167,39,16,1047,2935,2232,9431,6424,103,1970,6242,103,2232,2046,3083,2232,2028,113,6228,1388,1131,330,1086,24164,3528,2232,271,300,273,12994,1047,3492,581,25293,4140,7334,12994,1047,3492,1981,407,452,373,257,425,1790,39082,1523,2295,2880,24974,4730,1047,3492,1752,1367,373,257,425,1486,2854,1047,3492,1752,1367,373,257,425,2232,3388,3295,1047,3492,1752,1367,373,257,425,4297,1047,3492,1752,1367,373,257,425,3689,1047,3492,581,25293,4140,7334,2232,9427,1981,2295,5927,373,257,425,2854,1047,3492,1752,1367,373,257,425,4297,1047,3492,1752,1367,373,257,425,2232,2854,1047,3492,1752,1367,373,257,425,2854,1047,3492,1752,1367,373,257,425,3689,1047,3492,581,25293,4140,7334,2232,9427,1981,4708,1055,373,1029,2240,1047,3492,1221,1144,373,1029,2240,4297,1047,3492,1752,1367,373,1029,2240,2854,1047,3492,1752,1367,373,1029,2240,2232,2854,1047,3492,1752,1367,373,1029,2240,2854,3419,1047,3492,17966,16365,15234,9655,257,425,1484,7640,6904,425,426,4297,1047,3492,1752,1367,373,1029,2240,3689,1047,3492,581,25293,4140,7334,2232,9427,1981,2295,5927,373,2414,1472,2232,3689,1047,3492,581,25293,4140,7334,2232,9427,1981,2295,5927,373,2414,1472,2232,3689,1047,3492,581,25293,4140,7334,2232,9427,1981,4708,1055,373,2241,1366,2232,3689,1047,3492,581,25293,4140,7334,2232,9427,1981,4708,1055,373,2241,1366,2232,3689,1047,3492,581,25293,4140,7334,2232,9427,1981,1155,652,373,2241,7246,2232,3689,1047,3492,581,25293,4140,7334,2232,9427,1981,4708,1055,373,2241,7246,2232,2854,1055,1141,1141,3748,7640,15340,438,1951,27102,3689,1047,3492,581,25293,4140,7334,2232,9427,1981,4708,1055,373,1029,2239,2240,2232,3689,1047,3492,581,25293,4140,7334,2232,9427,1981,2190,27571,373,707,6845,2232,3689,1047,3492,581,25293,4140,7334,2232,9427,1981,4708,1055,373,707,6845,2854,1047,3492,7239,39435,1484,4504,373,1029,2239,2240,66,4817,373,707,6845,2232,3689,1047,3492,581,25293,4140,7334,2232,9427,1981,2190,27571,373,2127,1551,1657,2232,3689,1047,3492,581,25293,4140,7334,2232,9427,1981,2190,27571,373,1372,7640,618,2232,3689,1047,3492,581,25293,4140,7334,2232,9427,1981,2190,27571,373,2241,1608,7251,2232,3689,1047,3492,581,25293,4140,7334,2232,9427,1981,2190,27571,373,15231,5741,2922,1047,3492,10219,2322,373,37917,25433,7334,2232,3689,1047,3492,581,25293,4140,7334,2232,9427,1981,2190,27571,373,1568,2163,2232,3689,1047,3492,581,25293,4140,7334,2232,9427,1981,2190,27571,373,2241,23940,2232,3689,1047,3492,581,25293,4140,7334
+2422,334,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1388,2422,6947,343,3514,2522,2422,259,640,1423,7199,287,533,452,2322,533,856,1258,334,904,355,533,334,1501,3207,3158,12963,229,1146,856,773,90489,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+449,1612,425,426,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 729,44775,3744,449,1548,1612,9655,425,426,2046,699,934,2176,287,1549,2974,5593,934,2176,1335,3304,1037,1387,626,2974,5593,4003,2235,3516,3744,729,7560,44775,4642,3954,10215,7560,44775,729,1548,1549,449,1548,1612,9655,425,426,2046,438,770,50904,7463,6845,13626,449,1548,1548,5397,452,3826,2943,7648,2206,1483,25561,23893,2037,3176,763,5051,3036,4054,3742,412,3043,3742,66,3036,6021,1871,3735,3529,4456,990,4456,3533,1072,3036,4730,14461,6501,3440,2943,2093,5277,2939,2648,449,1548,1612,2162,2316,4717,1189,1612,2316,15728,13572,2967,7181,25296,668,259,4998,373,1029,1778,2162,3677,5917,2270,5917,15298,5917,2865,3742,2943,6201,2036,2162,3777,3032,5917,147,4529,10921,15123,6201,2036,259,1859,759,3953,7170,2439,2144,3316,452,2162,2881,5594,259,6972,2881,25296,1761,259,2063,17705,28976,642,5236,4152,4717,3281,19346,7532,1859,2865,3290,4717,2523,4561,2523,3290,4040,147,330,21026,449,1548,1612,5336,1295,16000,12299,1612,1367,15123,2898,25296,3266,2408,4163,15779,4998,27121,3123,24166,11888,5279,540,4163,44341,656,24971,5022,2865,2672,17582,602,4163,2672,2943,3742,2672,4735,259,16,2672,2675,2943,705,764,3123,15779,4998,827,3471,3539,5279,78287,2616,3841,3300,7181,1871,4442,2209,14888,14912,2439,7046,1329,1436,12094,1318,2144,888,2709,3823,1031,7170,3701,2850,5546,14888,2850,7428,10087,1458,12290,22421,4987,1436,13818,5455,1548,4882,888,3004,3701,4127,5300,4882,10125,5594,3471,9206,28700,25296,25296,449,1548,2865,3742,1612,1548,330,21026,5335,2246,449,540,7506,330,1755,5206,4260,3755,5917,147,1391,2944,1612,1189,3742,4594,780,17009,7689,4586,3050,273,273,259,4345,5,17981,934,505,690,2136,1431,1281,4281,5972,3581,1770,1189,407,25449,1364,2206,780,5889,3556,5260,297,3617,2861,780,5233,14832,4345,48865,3050,1570,522,643,259,535,148,1548,35978,6527,3300,1790,1555,1159,12677,3099,5450,1790,2908,2998,1549,2162,1790,1859,12677,5594,259,2162,4998,3777,3686,1189,2943,3742,2394,2943,3797,1548,3035,373,3038,16161,15123,3742,2046,22097,229,1238,16634,2162,16,4253,2414,35839,3609,6501,4040,2092,2119,22097,780,3071,12299,104,3768,5917,14825,1816,2063,13997,22097,1097,54,452,705,2391,4889,7585,4561,4040,2092,14825,1832,13929,2162,6972,6501,24122,6501,24122,9510,764,2675,6501,24122,5260,259,1548,6501,24122,2960,259,361,449,1548,1612,2983,7510,6501,24122,2943,3742,539,540,6390,14881,5014,12299,13572,5236,759,434,16877,2891,705,16172,3471,14876,1199,3043,3742,9655,6201,2036,28700,25296,16841,6128,2036,3766,330,1612,3484,2960,5917,147,5236,7170,16,18545,1859,4998,3545,3764
+119,612,2461,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 119,3734,2769,39,2228,343,10089,4990,5969,1476,1008,2934,2228,403,999,141397,2936,2141,3339,4990,4920,67,452,610,29,3926,3658,343,10089,4990,5969,1476,1008,152,8586,9,10,2295,425,426,763,15820,2132,10639,1483,152,999,141397,2936,2141,3339,119,4990,4920,67,452,610,2888,52691,390,50574,1129,1130,3036,1775,4763,3742,343,10089,4990,5969,1476,1008,49031,119,3563,16415,15191,419,751,1990,16415,1990,567,5969,1476,612,9459,29,10429,1458,3277,2405,1458,16415,1990,5969,1476,1803,535,2943,1008,1458,52,1990,1458,3277,3588,3539,4849,2672,2916,11402,3250,8061,612,2899,1329,7792,16415,1990,5969,1476,3110,15191,2405,3529,3187,221,902,851,1458,3277,390,3269,4016,3277,567,2211,49031,16415,5969,1476,49031,49031,1008,3453,2238,438,67,1458,3277,2405,1668,20985,612,15191,795,1458,4227,29,229,221,2238,438,2784,119,2992,49031,5960,2890,21548,229,546,221,902,1216,49031,8817,5969,1476,1008,3897,5232,4028,2316,5969,1476,7455,1008,3897,10,3099,2881,2025,2211,35858,49031,35858,229,3874,229,546,221,902,1216,3024,320,49031,1476,3277,229,10,2881,35858,612,10378,10,2881,35858,15191,3756,10,8847,35858,103,10,2881,8847,35858,10,5323,2881,35858,1008,795,1458,2405,10,8847,35858,3277,3310,49031,1476,10345,3219,780,1143,2994,67,672,9459,3471,355,3011,119,3471,355,67,1254,119,49031,2579,355,3563,52691,50574,1129,1130,320,5969,1476,2934,1795,2579,2292,5969,1476,3310,320,49031,320,35858,10,320,49031,2579,355,6987,7516,229,35858,2896,3123,2959,3860,4451,3595,320,49031,1476,3329,9473,49031,1476,1476,6407,229,3525,3823,1476,6130,229,221,2553,612,2156,49031,1476,2058,49031,1476,3684,6190,9459,975,3907,1458,3277,5062,21548,612,3282,560,2888,560,3277,3471,3227,2211,2025,229,35858,3471,355,320,3471,119,49031,2579,355,672,67,535,2470,3525,3686,7055,403,672,67,330,2028,2358,5832,1075,229,6398,672,67,931,154,1143,3879,2911,6190,9459,672,67,535,49031,2470,2310,119,3092,67,1008,7055,403,584,3525,2470,49031,2310,3525,1284,2960,403,343,1232,67,355,24243,1284,403,1832,3484,3334,751,4732,5003,2905,3907,459,5581,1284,2959,2960,2998,4990,16,403,49031,459,1284,2960,403,1832,3250,8061,612,2996,9595,4245,495,3502,7359,495,7189,2374,2375,2996,42935,1541,5397,3112,35858,10,229,3525,2942,119,3525,14230,12053,67,229,3525,10,4990,16,403,1843,229,403,1832,9595,4245,495,3502,571,419,4732,33,3525,1476,3639,403,5564,5596,672,67,2911,1008,3277,3471,355,5232,4909,9239,3277,3282,4534,5862,67,3555,6339,1832,3250
+780,834,623,591,223,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1265,552,553,452,336,393,553,1047,3209,3914,336,623,7100,938,2781,620,1254,336,393,553,21640,672,938,2781,6204,620,336,2996,622,623,3232,1254,271,1524,620,629,6169,584,1043,377,6171,6204,808,629,21664,3219,780,1501,37,10389,3603,986,660,3875,4308,378,5313,6204,2719,3671,345,3633,629,1476,1254,3232,1031,3039,10291,3862,3297,620,1254,3034,2728,3503,620,686,2987,3297,3267,1031,6096,5973,1254,1623,1254,3232,320,4909,799,4308,1254,620,2719,3671,629,1524,1524,1524,1524,2141,21632,1367,1136,21632,336,393,553,2141,3515,1969,620,96,5804,986,393,553,3300,403,1620,629,3343,1254,620,3232,403,7138,3232,3831,4308,6096,2701,3036,623,1748,5509,1254,620,31,17361,6204,535,6421,620,96,2141,553,3568,2194,2960,1254,10238,1730,2960,3118,1329,7642,5275,336,3928,3910,3856,2890,2310,2665,5930,320,5226,686,1254,620,2719,3671,629,5438,5788,1877,1254,620,8077,623,7681,3914,3535,623,1748,5452,6204,535,1254,620,2967,5203,3497,223,2141,553,3759,1254,620,2168,2050,4440,4440,3761,71,3210,2316,12086,4440,1733,629,1367,4506,5263,1921,21635,1367,9884,21635,647,5263,1921,456,457,960,2921,610,3210,1960,5994,3311,1969,372,620,96,552,553,452,647,11920,2316,4617,4783,1329,5047,3640,620,96,3232,320,7704,629,1676,104,1254,620,4356,1730,452,1142,3268,3210,31,355,3445,3999,1330,5058,457,589,7913,647,620,96,2565,763,4739,4586,17837,4432,2681,3519,7840,1049,2982,4586,1761,1630,856,591,163,3519,3686,2176,5254,2188,10340,1329,623,560,2996,1284,456,2029,3786,163,1978,1531,2960,259,163,5189,4308,6609,3232,3210,5062,271,560,3224,3516,5254,2188,10340,9510,1832,5786,2206,1483,3300,3700,4202,3258,647,3235,253,320,1623,4308,6974,799,4308,660,10236,10226,931,154,1143,65,9510,5254,2188,3195,1552,629,3267,5313,647,1484,271,3859,4468,3210,5569,3799,2960,1265,1183,21638,6600,647,2906,271,623,2530,647,2954,623,6225,2960,9801,539,1877,1254,620,3330,3967,2522,4308,10236,17361,3210,620,2316,7704,1254,1388,1950,10,103,3501,3761,393,553,3620,3898,3494,808,4849,3768,1730,960,452,3859,1254,3757,620,3267,623,902,5047,2914,5106,3449,2549,623,229,2975,452,3628,1183,271,1043,377,7044,2890,163,535,1826,3158,21665,1474,3158,553,229,517,1284,6091,67,4748,10345,3263,393,3536,5203,4539,780,2211,620,1703,3685,1524,620,647,1524,620,445,827,1956,21640,5426,620,3266,1335,1254,623,1748,21640,2211,173,21640,1254,3232,2719,3671,22107,3859,1978,2194,3210,21640,1043,377,271,3445,271,647,2814
+206,207,208,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 343,4031,533,514,1131,377,81,459,834,4673,3797,3334,5584,3933,3471,269,514,10453,7905,355,3441,2868,12870,12871,514,2088,233,561,514,2470,514,4840,3334,8738,1956,207,208,32334,2232,13510,1818,3606,207,208,6353,11701,1206,13458,32334,207,208,9912,124,8304,3844,2232,18408,3308,8722,83047,2287,6624,207,208,31476,2059,124,207,208,6353,7560,4187,207,208,2357,10468,1180,2357,10468,207,208,999,2528,2287,207,208,2357,10468,1180,10670,2357,10468,1180,207,208,10670,6585,8870,6585,9252,135480,2287,207,208,18616,397,1424,6274,207,208,14396,2232,13458,32334,207,208,9912,124,8304,3844,2232,18408,3308,8722,83047,2287,6624,207,208,10456,5352,10456,967,207,208,6353,8734,8247,207,208,2328,7103,3816,207,208,2328,2366,2934,60422,5227,5248,2328,2366,207,208,2934,60422,4130,5398,5227,207,208,30370,2077,206,929,207,208,6353,19132,13540,207,208,10444,207,208,32334,10444,10630,1757,13503,5227,207,208,18890,6353,4477,83045,7664,1524,83046,207,208,10630,13510,1818,3606,207,208,6353,11701,1206,207,208,10630,2232,10618,10662,7888,207,208,6353,65322,6312,207,208,2181,207,208,2206,6353,15863,24751,70466,114029,8738,12879,3536,12880,269,2814,4651,269,514,5568,5779,269,514,269,2814,2470,114033,208,124,114033,208,124,1524,47183,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+571,31,1,147,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 55110,96698,55110,96698,1767,2977,147,571,55110,96698,1767,2977,147,571,419,6820,29381,16776,2028,27652,4730,14659,1367,29381,16776,55110,96698,2202,7889,3666,1367,6203,96699,55110,96698,2977,147,571,419,6820,1367,6603,2028,15723,3334,5584,1623,1181,3343,7889,61117,7889,55110,2814,61118,4004,27652,4730,14659,2028,27652,4730,14659,1367,4004,4308,8119,3006,48645,16905,6996,29381,16776,207,3464,1970,3334,55110,96698,1767,2977,147,571,419,6820,61119,3954,61119,51924,61120,3870,113,96700,691,3905,3039,49372,41921,264,3346,1552,3870,3843,649,3870,113,760,9998,61121,35224,3870,2405,3983,2338,369,1367,3876,3231,959,7093,3603,253,147,571,419,6820,3876,2552,11797,6820,3756,9686,4220,96701,7889,271,5327,3734,1238,4220,7889,491,2296,3786,1111,6203,96699,533,1960,21517,7889,491,1367,29381,16776,55110,96698,2202,7889,3666,1367,6203,96699,55110,96698,2977,147,571,419,6820,1367,6603,2028,15723,3334,5584,1887,2958,61122,44348,4730,14659,3158,55110,2814,55110,96698,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+293,294,295,296,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3906,1047,296,660,3902,1755,1047,296,296,1687,2316,285,1827,1795,1423,3678,6414,1687,296,104,1687,296,7757,7176,1687,296,1687,296,1687,296,349,3458,296,3083,5829,1281,15735,2136,1281,1687,296,1687,296,718,2192,1687,296,718,938,295,1867,2192,1687,296,718,849,2192,1687,296,718,1866,1162,1687,296,13820,13819,10508,1687,296,2967,15714,1870,8205,1687,296,2967,11345,6250,1687,296,2967,11345,5056,1687,296,2967,10224,1687,296,2331,2439,1687,2439,349,3146,4367,1687,2439,349,171,175,1687,2439,349,1014,4279,2229,1687,97494,2439,4279,2229,5425,16906,1687,13665,5425,16906,13665,312,21070,7385,873,10170,1687,296,873,1687,296,1143,285,4928,873,1687,296,1143,3147,2067,3529,1687,296,295,296,2316,285,1827,1795,1423,3678,6414,295,296,104,3678,6414,295,296,7757,7176,295,296,295,296,295,296,349,3458,296,390,4134,295,296,390,4819,295,296,390,294,295,296,2316,7052,4134,295,296,2316,7052,4819,295,296,2316,7052,294,295,296,3083,5829,1281,2192,295,296,15735,2136,1281,2192,295,296,718,2192,296,718,295,1790,1114,2192,296,718,295,980,1114,2192,296,718,938,1867,2192,296,718,574,693,295,296,13820,13819,10508,295,296,2967,15714,1870,8205,295,296,11345,6250,295,296,11345,5056,295,296,2967,10224,295,296,2331,2439,2192,295,2439,349,3146,4367,2192,295,2439,349,171,175,2192,295,2439,349,1014,4279,2229,5425,16906,295,13665,5425,16906,295,13665,312,21070,1281,3170,873,295,296,873,295,296,1143,285,873,295,296,1143,3147,2067,3529,295,296,296,16691,1827,1795,1423,3678,6414,16691,296,104,16691,296,349,7757,7176,16691,296,3678,16691,296,16691,296,349,3458,435,693,16691,296,2316,7052,16691,296,3083,5829,1281,2192,16691,296,15735,2136,1281,2192,16691,296,718,2192,16691,296,718,1114,2192,16691,296,718,1114,2192,16691,296,718,1114,2192,16691,296,718,295,1114,2192,16691,296,718,3281,1114,16691,296,13820,13819,10508,16691,296,15714,8205,16691,296,11345,6250,16691,296,11345,5056,16691,296,2967,10224,2192,16691,296,4540,5829,16691,296,2331,2439,2192,16691,2439,349,3146,4367,2192,16691,2439,349,171,175,2192,16691,2439,349,1014,4279,2229,248,16691,16691,248,1423,16691,248,349,1143,285,873,16691,248,1143,3147,2067,16691,248,4279,2229,37598,16691,16691,37598,1423,16691,37598,285,4928,873,49977,16691,3147,2067,3529,16691,49977,296,2293,2316,285,1827,1795,2293,296,1423,3678,6414,2293,296,104,6414,2293,296,349,7757,7176,2293,296,3678,6414,2293,296,2293,296,349,3458,2293,296,3083,5829,2192,10663,2293
+1412,1,1413,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 47761,5958,817,4127,535,16700,10534,1352,1413,74662,901,1335,47761,1735,101,1526,2691,2322,67,287,1549,425,426,7310,3304,3308,3304,47761,1735,6663,47761,3962,2211,26211,86388,8252,6299,15363,47761,5958,817,4127,535,16700,10534,1352,1413,74662,901,2746,1111,216,4459,4123,901,51120,10534,4444,5039,74662,425,426,1735,101,1526,2691,47761,4813,2398,817,163,4872,74662,376,505,4444,5039,51120,10534,2522,2560,4459,16700,10534,24304,16700,10534,2724,2967,1352,1352,7054,535,505,74662,5527,717,6613,4459,5934,4459,349,505,11101,307,3146,717,5596,5408,14130,14268,732,14236,5215,5051,51120,10534,1352,4444,5039,74662,14140,5207,505,74662,2132,10754,2507,24304,16700,10534,2724,5527,717,6613,378,3015,4459,2439,2746,672,51120,10534,74662,1674,2121,7607,3026,1413,47761,1264,343,1526,3531,505,74662,30540,3531,3581,505,3015,4459,2439,3096,2211,456,4444,29,1526,1567,1413,3324,505,74662,2185,1391,3117,1795,4444,5039,51120,10534,4444,5039,1413,2967,8922,4444,5039,14292,312,4444,36648,3261,4459,4392,456,4444,51120,10534,74662,2967,74664,1352,1352,7054,6094,2945,353,693,51120,10534,74662,3898,16700,24304,3096,2211,4444,18149,6613,4459,5934,50,1413,7205,717,47761,567,14150,7607,4403,1412,51120,10534,505,74662,2967,1668,4444,5039,14292,13818,1735,1413,4444,5039,6094,51120,1526,2121,74663,51120,10534,1413,3090,353,1526,1413,6094,51120,1413,4444,5039,16700,10534,1413,3898,5527,717,4403,1412,3090,2394,51120,10534,4444,5039,57136,1687,1413,2746,1183,7607,3090,1413,4444,5039,51120,10534,61295,47761,2132,10754,2507,2968,32611,3313,25202,3843,74662,10381,61295,1490,47761,2132,10754,2507,2968,32611,3313,25202,3843,153819,74662,3158,47761,2814,82468,82469,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+277,1,278,279,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3648,931,490,5657,5787,1781,5385,8306,3916,14447,14448,1087,3926,1087,334,26780,5530,5657,5787,21805,2561,13915,14672,1744,858,397,1679,10281,5767,932,4433,10277,3648,2936,279,931,2393,2545,2948,5347,1247,2861,3353,3494,2966,1247,2861,4218,20603,15,768,5487,20028,6662,8280,7916,3030,120,202,1247,2861,171,1775,2440,191,343,1247,2861,2886,1716,175,1247,2861,3868,2119,20779,773,3744,8900,3648,8304,2935,5593,251,570,3344,3583,3268,403,3648,3297,1247,2861,3146,3770,935,5767,8304,2935,4642,4593,251,10381,3779,3237,2454,3854,4281,3648,403,2942,3700,3581,3648,403,1247,2861,2980,1679,1109,2238,1734,3470,4150,8310,67,1042,403,846,5203,1679,2238,2553,10272,3451,3523,5047,1247,2861,2994,3048,8280,20028,7916,452,6085,3091,1488,1228,1247,2861,3348,2228,2967,1042,8304,535,431,3503,3734,207,1149,104,403,12407,3629,2168,1431,3344,6263,1503,403,959,8910,6840,17053,7916,1566,760,320,3471,959,6,1064,194,1843,3937,5466,1832,2753,1042,10381,5767,5181,357,3573,3558,1247,2861,10381,431,535,20028,8280,4171,3258,959,2861,1149,1503,7814,3565,760,7093,320,3471,7461,3616,20028,7916,9433,535,1247,801,2935,3048,8280,122949,522,1247,2861,3779,1143,2675,10359,5593,2753,602,959,8107,535,7916,46927,9314,251,760,7580,8107,4642,1481,3344,6654,1409,5339,223,5593,2614,452,856,10359,3348,8304,1247,2861,6353,9433,7916,3235,39531,3854,3907,3265,330,3281,3237,403,5151,11233,4218,3700,251,10381,163,1516,10381,67,1247,6193,2188,287,3310,2992,3523,4610,184,19752,46927,3216,620,4703,4015,3313,1247,2861,403,1042,8304,10272,5480,175,10272,15418,2861,357,2119,10159,2238,40,3348,8304,2935,1893,14,1014,7347,8304,71,1216,1247,2861,535,431,2119,20779,773,3744,8900,3648,8304,2935,5593,889,2232,229,546,6188,693,1247,2861,7012,8280,1859,522,223,764,1488,203,6474,2888,165888,175,522,3651,4071,1125,8280,1335,1642,6662,14571,5593,223,9433,6662,8280,889,1967,1653,1832,1488,203,3558,3337,6281,165888,1642,3761,158,590,764,1526,3558,3337,67,2911,560,8280,501,67234,3195,8306,3589,2675,4589,2914,7916,6353,403,44769,6656,2155,2388,2553,2181,3454,2077,2558,1597,5480,1247,2861,175,7573,5181,40,2238,10272,3490,1893,1730,1143,1247,2861,175,934,2927,40,2020,2021,175,5657,7174,2850,6250,1086,795,2106,1506,932,4354,1157,295,1687,752,986,2331,9281,2560,10524,8205,2439,7776,7777,448,828,3854,1733,11196,1042,1247,2861,175,3531,1012,21821,1247,2861,4218,175,5899,1012,3043,104,8091,4633,3471,3663,120,1247,2861,3942,171,175,1010,277,175,229,546,71,3855
+773,2157,2158,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 664,22804,1335,271,452,163,4610,464,2157,664,22804,1335,934,295,1676,959,154,1111,3310,13263,5286,959,7382,3559,959,5203,3224,2296,3667,22787,959,190,36161,11437,22300,62025,128612,271,452,163,4610,464,2157,5237,1199,3742,18359,561,5313,2296,91837,561,1208,271,4564,3261,234,26591,13618,2296,2157,4116,3689,3997,7068,4303,1424,5195,452,3471,154831,672,7607,4689,2157,7458,3930,1264,6092,1367,1412,3344,4689,2157,3334,37,3027,773,7607,2157,2157,52768,2814,44534,1367,3475,3626,5181,2296,1008,6603,3334,4109,14455,4113,372,452,4852,1143,464,3038,2157,1367,7607,7113,10174,3603,1430,6971,561,1065,2296,1921,6546,574,14087,10174,3039,5231,6344,2157,1795,1424,1258,452,672,4516,6297,2157,49501,12091,2296,2157,2888,3982,3999,464,1111,1258,5958,154831,3135,986,10104,3343,4533,2157,4689,2157,7607,1367,2157,52768,2814,2865,452,2369,2296,634,3024,8879,2369,3039,13942,26220,3258,48645,561,2157,21535,4402,464,8119,3768,26220,12086,2157,3326,3108,26591,2296,271,1008,4886,5527,4533,13618,2296,3229,23400,12091,1367,12091,1367,7607,2157,52768,2814,1199,8297,452,3158,52768,2814,36161,11437,664,154831,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+516,517,158,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 29623,103909,3351,165,18077,3158,29623,2215,2814,934,377,81,1335,940,2470,2470,186,165,67,3734,4113,3516,7816,3466,3310,103,2850,1402,480,5385,7023,165,660,3466,5131,773,103,1597,9306,1179,1180,529,839,47163,802,165,543,15219,1065,336,4451,40,1796,1796,6693,24499,4859,2467,4838,529,20328,47163,529,346,14162,1813,1631,29836,1631,95,165,1526,5131,3773,1973,63637,23260,4167,223,435,23722,223,1277,3848,2862,2215,165,643,103908,223,5131,660,802,18992,340,1597,5896,1960,2974,5593,1843,107,165,18077,2322,101,648,371,480,435,2211,2296,3351,165,18077,336,3351,3351,26,2252,1317,3046,7428,1795,3269,3351,1065,336,3868,827,4819,578,4819,1969,1795,827,3311,578,3311,3834,3351,911,2842,1065,336,4514,9995,2087,1652,700,516,285,1354,2922,9995,2087,403,3751,911,3351,911,2992,1145,2768,371,4692,2952,1070,4157,1596,3043,371,2087,2853,809,9995,1012,1131,9762,32802,20535,1673,711,4655,2905,23319,633,2840,4523,32802,3048,1813,25275,1778,1673,711,4655,2905,2312,773,20941,1813,340,21226,456,10043,21226,273,701,1481,2768,371,1813,11972,2439,773,5131,2292,9995,1500,9995,20121,39355,9995,9995,20052,1265,9995,33022,803,1033,7777,535,3299,2087,711,2106,4644,2087,5062,1012,11124,2959,3481,4133,711,701,91,1196,1968,25136,39355,3051,701,3503,2087,711,382,3258,839,338,3351,158,4447,24795,7254,371,30681,10927,413,3047,1986,546,33502,24781,1674,3751,2022,475,911,30661,168,435,3351,911,2190,1065,336,2270,9995,2087,32853,6086,9995,15620,3453,1012,1961,403,273,3351,158,2952,1145,1065,336,3751,158,4447,7781,371,1662,531,58152,1608,371,3295,934,4445,764,3808,12031,1799,158,4447,3311,14469,2952,2190,1145,20483,371,764,4540,209,4445,2206,158,3609,12144,1183,25371,59194,3351,7023,911,2270,3484,158,65009,5120,371,4401,1968,186,158,2192,378,3582,443,3311,2190,23409,158,98,839,516,12445,17259,13530,6530,4207,1678,17259,13530,1755,158,911,2270,158,378,1391,5505,12143,3751,2022,3477,20675,9663,371,2190,20675,13647,371,3351,2396,4254,403,3453,1816,1143,285,827,768,516,773,285,349,2934,3351,20483,2292,285,19347,403,768,1264,3351,2396,12576,827,768,1039,3928,1065,336,827,26,768,78614,768,516,1264,3351,403,1131,3351,516,3097,3351,403,827,26,768,1264,3666,3351,403,827,768,403,5660,1277,3351,7023,911,11097,158,1065,336,50513,773,13647,371,5189,443,773,158,4447,3311,6272,101677,59510,3351,158,2194,531,3043,17071,24375,371,4445,413,4944,4705,10927,1055,1832,12031,3351,911,2842,2190,1065,336,2270,9995,2087,20484,2028
+456,457,1381,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 456,173,456,457,1381,4706,3522,934,3346,1766,1735,393,377,459,2211,1780,2785,456,173,437,3459,1780,456,457,1381,4706,3522,1780,1766,2992,4706,3522,456,457,1381,4628,437,3459,2785,6474,3471,457,1381,3522,41442,41442,3503,1856,4761,2785,2956,7122,41442,3897,3031,1780,2975,456,40,12781,3047,1055,113,456,452,320,457,1149,457,1381,2156,41442,2185,9469,1407,3459,567,113,1729,2579,6320,9469,452,320,1014,41442,437,1780,1986,3906,4706,3522,4482,203,457,622,6160,3211,3030,717,3589,10249,16509,3459,555,41442,2785,11202,2439,437,443,457,3943,457,1381,3522,437,2785,457,1381,3522,3459,2785,2785,457,1381,3522,8381,2785,1746,1409,2864,2785,3930,3308,3419,934,3346,1766,1735,393,377,459,2211,48640,2855,2814,6765,22185,9082,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+1667,447,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 175,447,611,535,3718,44076,5538,464,987,4644,2084,3508,611,5446,5694,3839,533,8710,2982,2983,2781,464,8076,987,2992,2889,3470,216,986,987,5694,397,2992,1143,11440,648,397,11440,11758,447,11440,3328,464,611,535,2719,7409,1837,793,1667,441,175,3106,611,6069,175,11758,175,447,6671,312,3341,11440,9462,2781,2701,44077,175,11758,11440,438,175,447,11440,397,2992,2467,6423,6248,175,447,611,601,6974,378,2635,2467,4362,2467,44078,2467,3046,4362,2467,3046,4362,2467,3274,2391,7844,1141,413,6678,1676,175,447,4254,611,535,2681,397,2701,10834,175,4254,447,17,611,601,986,987,2408,397,2914,10834,175,447,611,535,885,2149,5343,4113,5694,2316,3898,6429,4644,987,7900,107,2982,6423,10834,175,447,611,535,1149,3344,464,175,4254,2665,10460,44079,44080,611,35,535,2084,4811,11758,1318,447,4162,6635,6959,2467,7497,44080,535,931,935,6069,3475,1524,44081,611,349,171,3234,931,3522,1676,5446,464,533,8710,12359,5975,1409,986,2753,611,35,44080,535,6570,1257,171,4254,2571,1671,2439,2674,6121,827,464,8894,1730,533,2366,74,1524,29853,2287,11530,44076,2127,2287,9245,2287,11229,8264,5781,2522,8710,1730,74,457,3588,4317,173,1455,3792,3444,5047,3103,3784,3106,6466,611,397,397,929,18425,186,2119,6342,1581,2665,378,6423,464,611,535,6069,378,464,611,535,3588,2119,413,5975,5975,3841,378,464,611,535,4017,4162,3344,464,2206,16,611,2084,4547,5064,2992,987,986,1287,17510,5366,578,420,44082,163,3644,2722,611,6127,931,6631,931,3651,175,6504,987,4644,794,987,420,1524,29853,7927,9245,2287,41062,44083,4017,2665,6087,6649,464,987,2634,372,5975,3841,378,464,611,535,8125,1827,3718,44076,5538,482,397,2393,397,4031,1289,229,106,271,300,7222,7222,271,300,591,706,2701,343,4031,611,2084,1194,2393,2951,2954,5584,611,397,533,175,447,611,535,3043,175,3106,5975,30884,4699,11440,397,6400,1412,3680,4699,11440,3475,29853,7927,41062,44083,2310,3954,3565,3580,6069,931,52,11440,3328,611,535,1039,464,6956,3512,175,940,413,3234,2560,2665,931,52,11440,578,889,2602,578,16354,175,420,41062,44083,1211,2968,11440,3328,175,5181,611,8075,931,2968,3814,611,535,464,29853,44084,29853,7927,41062,44083,793,2968,611,175,3857,5020,611,1856,601,171,7594,175,4254,5593,29853,44084,931,2968,611,175,3857,768,13626,932,2701,987,171,29853,44084,29853,7927,41062,44083,2316,107,175,447,535,4761,7034,611,601,434,1524,987,3931,987,987,987,6228,3931,4644,987,44085,434,7497,611,535,1524,581,1143,611,4254
+2102,23,882,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2476,29,3307,3251,10121,2906,856,65,435,50,441,856,3448,229,271,409,3251,3542,3929,856,882,28300,371,882,28300,371,883,2731,4182,29,3307,3701,3348,2681,2942,2211,4740,3954,2470,2476,934,29,3307,8206,1329,8206,1795,8206,285,8206,297,3251,10121,2906,856,65,435,50,441,856,3448,229,271,409,3251,3542,3929,856,882,28300,371,882,28300,371,883,2731,4182,8206,934,377,8206,14543,8206,2470,2211,3516,1254,8242,4266,5415,3441,5003,103,221,299,3251,10121,2906,856,65,435,50,441,856,3448,229,271,409,3251,3542,3929,856,882,28300,371,882,28300,371,883,2731,4182,29,3307,3308,3852,1143,3703,1567,2176,29,3307,834,23564,3616,23565,3616,23564,2814,23566,3701,751,1216,13730,3043,88151,3251,10121,2906,856,65,435,50,441,856,3448,229,271,409,3251,3542,3929,856,882,28300,371,882,28300,371,883,2731,4182,1216,3701,751,1216,2476,3547,3703,5382,5962,2476,412,2719,1833,3547,5075,229,2906,856,271,409,3547,3542,2731,4182,3929,856,3717,273,882,34099,7271,882,3310,3251,5075,3371,3929,856,555,1990,1833,1567,555,29,3307,311,5075,2719,1833,1567,3192,4381,3841,43675,3547,3687,1322,3536,4729,9912,3251,1264,2719,1833,1567,1322,3536,3343,1837,1567,1014,11225,10834,1567,3024,1322,3536,2719,1833,1567,8129,287,3536,3343,1141,3287,1833,1567,2927,3703,1567,4031,372,3536,734,3547,2188,3903,3536,3547,104,3027,2719,1833,5313,3547,390,3742,29,3307,4729,172,271,409,5075,26015,1567,299,555,29,3307,2476,311,882,26015,5075,2176,2719,1833,1567,3192,4381,2476,3841,43675,5075,3687,1322,3536,2476,6423,2781,3251,23574,2719,1833,1567,2476,3024,3278,1322,3536,2476,4923,2719,1833,1567,2119,2635,2927,3703,1567,2476,4031,372,3536,734,2188,3903,3536,104,424,251,3536,3343,3189,1141,1141,3536,3547,2414,46714,2476,4851,50,856,555,59,3222,3217,1004,1005,1516,3348,3278,3547,2968,287,10390,2488,457,1012,3014,1131,2476,4851,40,59,3222,3217,1004,1005,882,3701,533,393,50,1494,52,610,1294,1874,2769,882,271,409,16745,2461,3348,163,5488,3227,2322,1827,413,2558,285,3037,67,2211,8502,8502,2476,2814,13370,67,3348,4310,2731,4182,3929,856,2729,1338,261,2312,2729,3486,67,3027,67,2911,2719,1833,3547,390,1567,299,555,29,3307,3914,1883,8060,8181,1970,3334,13730,3043,3701,751,50,1494,52,2729,1338,3929,856,2731,4182,8238,4016,3419,7836,1524,96762,3345,2948,2938,8206,6120,620,375,554,2476,934,5569,154,5313,2211,3158,2476,2814,23634,2476,50,3308,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+2456,817,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2012,2980,3520,1045,4025,3737,2012,2980,3520,1045,4025,3737,1045,3520,1045,4025,3737,186,3884,413,1045,103,1183,31,3014,3884,31,3269,6140,3031,3520,1045,3737,1264,8616,51,1678,2456,817,1111,441,52,4628,4025,6282,6498,2012,175,5936,2935,287,3603,253,1045,8647,1795,1111,3013,3520,2456,817,1199,2974,190,567,3237,4025,858,3038,3235,4025,858,435,1264,1770,759,190,5236,2012,190,6820,8306,171,2850,3606,35044,1526,3492,377,3532,1901,1795,1827,2558,285,5513,3038,2012,3024,190,4006,4179,2996,1045,2456,817,3038,1901,285,5513,1555,1111,1045,7386,2843,6972,1526,2724,567,16170,4561,1045,3553,9148,780,2300,85,2012,3254,4179,1045,889,3637,705,491,1329,2232,4342,4323,8322,2009,4025,535,3018,343,1045,361,3269,3189,271,870,1338,4025,535,5363,3118,1329,1045,47515,1008,6522,3309,4025,858,3013,3295,1045,6077,1338,8859,3661,3516,285,4025,377,5080,84,340,529,20703,84,3737,355,413,1045,464,1856,1012,51,581,535,377,3013,3544,1012,377,3520,4025,3737,2603,377,104,377,285,1338,1317,287,2211,3030,287,2211,4802,252,3737,7716,4202,1045,452,464,361,3737,2369,3099,2908,3520,2316,464,5936,2935,1045,3737,6412,1045,4025,535,3520,4435,4025,377,3520,7571,4610,8825,165,285,175,10809,722,859,8825,285,8825,764,574,2012,491,3520,808,1856,3520,4647,27389,5876,6036,2252,28542,285,285,3737,3096,763,1760,1199,285,764,2369,6501,3326,44213,8076,1045,464,3725,27850,2909,1045,1676,386,13505,4380,65,340,322,1109,3929,2012,4551,576,2119,5206,4032,295,764,4529,4489,171,5456,1256,1045,4025,5969,5972,4025,1045,3903,3027,2211,3014,2948,3202,435,705,3903,3026,1970,1045,1111,3083,3308,1256,377,285,4565,6479,104,4610,722,6479,104,1111,1409,171,2968,4025,3520,2936,3520,4641,1264,15140,377,858,435,3013,1012,3520,3038,253,3737,3879,3041,3520,3520,3885,795,349,1045,340,4157,2966,5080,4335,535,5905,435,20703,62,3737,355,10809,3771,2211,1045,491,3202,1045,2012,51,1678,2936,3520,285,567,5824,21075,13346,51,1678,3192,3013,3520,1678,22365,730,3235,4565,3014,3230,413,764,26658,1111,1045,3520,1131,2211,1045,3202,1045,2012,2456,817,856,479,705,535,31,3520,438,287,3516,1131,705,3520,3013,795,229,6613,175,3598,2456,285,5796,3520,3013,3038,253,14827,764,3903,2456,817,223,2211,4570,116725,343,3202,2296,10809,4475,4183,3158,10809,3128,2814,4025,223,2012,6923,6182,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+374,49,1396,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 2744,1043,377,2744,1043,377,187,117961,491,1043,377,2952,1048,271,187,117961,491,1043,377,3014,1043,2176,2968,377,1330,187,117961,491,1043,377,491,490,1043,2176,3930,24824,8807,21379,2744,1938,2814,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+1382,1383,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 5151,4068,2922,4486,1382,1382,1766,1986,2864,2886,1596,214,152,2794,759,152,5151,2228,403,3466,152,2794,1055,1484,8558,1382,2906,2001,4374,1990,1596,214,2922,2132,1483,152,763,5051,330,4486,1382,5275,1775,4752,6127,2906,2001,4374,1990,1596,214,2132,2001,4374,2571,2171,1986,2864,2886,1596,214,3059,3767,20063,7012,3714,2001,4374,1676,3840,3448,2001,4374,1990,763,2864,2672,751,4374,4406,2672,763,856,1037,1986,2864,2886,3280,1085,935,3023,23041,856,3814,1693,2321,4468,30,5487,856,2753,5152,10275,1228,2889,2321,567,5960,2890,1594,1693,452,21401,3512,567,2018,5994,2945,3535,413,1329,3260,3274,4316,650,14376,2558,21401,4515,186,2322,3903,722,6127,2049,1985,3445,6248,21401,764,3512,7398,3013,6238,858,764,3678,2558,4515,186,2322,3030,858,5088,6538,14376,2316,7676,3520,3550,858,3030,3540,3445,2864,1216,1221,3083,21401,929,4357,6299,10701,186,2322,2602,3519,3280,3281,357,2322,4783,103,3971,1469,6087,3857,14376,3122,827,3519,2018,5994,2945,3535,7145,2889,1693,2321,1596,214,5078,2906,2001,4374,1990,16619,1596,214,11212,3519,3261,3872,5373,2018,4515,186,2322,20063,3512,858,8859,3637,905,20063,567,858,1970,4374,491,3261,23756,4805,3714,329,67,535,3663,3236,3705,3110,11933,2982,67,21401,11118,3628,1555,67,867,2979,5547,1477,3659,16619,3644,2473,4950,388,3637,4160,4853,437,6249,4950,5487,21401,1975,1883,1407,1883,21401,16619,3580,3457,3637,3558,2996,1214,1483,3598,491,20063,567,2001,4374,2119,3236,1309,413,2310,1329,42705,104,3683,3547,2553,555,3236,555,3682,8146,104,3683,7597,1309,902,16619,4227,8930,3110,10264,1802,11484,4999,4406,2321,5618,10264,2906,20063,3678,2558,2001,4374,1990,6817,7066,11484,4406,103,3522,3628,2867,1901,388,221,20063,3628,4445,4406,978,435,221,3503,3330,2454,5975,3090,175,2945,4515,2322,1214,3091,2558,3751,4245,751,2001,4374,5000,986,3772,21073,2119,3236,3717,271,29,3522,2753,2310,2321,2789,1141,20063,1676,357,2244,13150,175,3445,44021,320,6208,4515,940,6299,10701,3086,61610,20816,2879,3031,3653,1986,2864,2886,6196,5994,357,763,2558,6248,3872,2996,464,21401,2036,1329,3856,3094,763,764,4515,186,2322,986,7186,2769,3519,2681,3547,2681,3547,21401,1111,2622,103,6248,21401,332,2959,764,2908,2935,856,207,4374,4406,2321,856,177568,2929,513,371,3640,856,2029,2408,2929,513,371,856,6397,5000,5089,986,46,202,1693,2321,7174,2030,2440,1775,20848,4805,2996,1790,535,437,1162,1228,4638,4887,1693,2321,856,1376,5000,2996,3236,986,43658,1280,4256,856,808,3581,3765,4374,856,2906,7913,3234,3686,856,2881
+1880,501,1881,115,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 1880,1332,8899,11796,533,1388,1524,21537,1970,1388,1332,3906,2176,269,438,3840,278,1109,6585,206,1409,1597,5352,940,505,67,501,1881,2470,7898,2681,397,3618,1332,3903,1880,4254,2176,115,319,392,10452,343,4031,533,1332,343,115,67,6664,438,3840,1332,23098,1362,501,1960,397,1332,2181,1960,4031,567,14162,4538,2968,1490,278,1109,34823,2814,1332,343,4031,533,6585,206,2487,252,259,2886,278,10690,1409,1597,5352,578,487,166,10087,36645,115,355,32279,23098,1362,501,1960,397,216,3015,39977,7176,39977,6384,36645,115,355,1332,578,487,166,259,115,2886,940,259,115,2886,343,4031,115,14654,635,156,505,110642,1332,678,23098,1362,501,1960,397,67,501,1881,1332,3841,14699,1332,533,452,531,99,10,4054,1985,3947,269,940,397,1332,343,4031,115,14654,635,156,533,1388,35,67,1881,8107,1335,274,2794,934,265,5569,5779,3662,1161,343,514,2219,343,4031,533,2176,3930,6140,1388,3475,2922,3158,11065,269,2814,1880,1332,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+52,107,36,129,315,794,8,1072,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 109595,4225,457,856,25460,2270,5549,3409,4225,4364,457,856,25460,3409,457,856,25460,5567,456,457,2951,355,1596,336,70499,2895,27625,5072,336,393,5502,1228,1549,2369,457,67,355,3014,940,2996,2967,3033,1846,2951,3914,2822,297,3161,457,6202,456,457,2951,355,1596,336,106,27625,2369,457,67,355,336,456,457,2322,336,393,5502,1228,1549,1295,58314,105468,470,319,490,1079,392,1128,2827,4636,1735,3701,490,106,336,20485,20484,8411,109596,3441,2141,2883,470,336,2483,315,2794,3696,109597,109598,69125,470,321,4869,490,393,2267,16846,15197,2161,54209,336,9756,2946,326,691,4636,2951,324,2322,3784,2948,2951,1596,336,106,27625,336,180,315,2483,3696,53,2483,315,223,695,3906,3440,457,856,3797,2176,3441,5962,457,856,438,457,67,336,2483,315,2864,48,315,2864,9,10,315,2864,457,172,101,3330,457,856,2883,3053,1744,5913,2883,4605,101,1744,2874,4605,1871,2883,4605,3281,568,4605,2883,4605,5788,457,856,929,2579,457,940,457,826,929,464,1087,856,3499,623,1780,3327,1748,3767,645,3236,21548,645,3236,546,371,3349,52,2691,645,3236,336,3349,52,2691,645,3236,336,393,287,533,6649,457,856,3501,555,3501,1814,2701,67,6968,772,1477,3018,5930,2899,3766,4133,3409,3409,3509,5930,1477,21492,3322,856,8048,4132,21492,867,535,3034,21492,146,1814,21492,3563,3211,21492,650,3501,2228,3295,3419,71,1216,961,223,3553,2794,3767,3909,5334,3909,940,2862,3233,3909,4664,3909,3409,4038,3322,4878,3909,648,315,3504,623,3909,23870,315,3967,3440,4225,3640,3409,1712,1960,69125,490,3764,315,2483,105468,490,109599,457,856,1970,5933,2794,69125,105468,67,2023,555,25460,3921,2914,457,5352,4225,3409,2881,648,1111,5233,3409,457,856,2454,175,2389,3809,1967,457,3816,388,5513,2119,3567,3816,3799,5567,3195,491,37762,7533,3234,2865,457,856,2881,413,3947,3448,340,81,5181,3092,3409,457,2701,32,3310,2992,763,457,856,397,5352,457,763,457,856,3014,438,555,3797,2176,3797,2176,457,856,5327,438,2211,67,330,3409,330,1141,1501,1143,1381,3441,5962,12464,555,37762,7533,3842,457,3816,3868,2176,3565,3311,856,2316,58404,22734,251,5829,856,2454,438,457,67,555,3609,113,457,101,452,3330,1131,438,457,1597,3489,336,315,2864,2883,555,672,3409,3449,2228,3053,1744,5913,1871,4605,568,4605,5788,856,929,2579,3448,555,3609,3648,560,457,6281,2968,929,3640,4120,457,464,67,5004,3583,3640,3563,3092,457,3501,67,555,9473,3606,535,961,3447,2899,3501,1814,1381,8048,67,25460,2119,320,2992,435,457,856
+278,1109,1,312,155,156,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 12870,856,4902,3906,2141,14890,3440,12870,3840,856,5074,5181,329,1775,287,533,7167,20436,2003,4362,156,3964,6804,448,1513,2949,2078,156,2090,533,8801,3516,36642,3902,3538,12870,940,584,12870,3696,1483,79,856,2571,2171,4483,2003,4362,156,4483,1513,4483,2949,2078,156,4483,8801,2908,1214,12870,12870,856,4902,2141,14890,343,4031,1615,2078,156,12870,6076,343,4031,533,269,3338,3013,2701,397,18726,2078,156,2898,1329,2310,2665,4852,12870,3764,3494,15870,474,1513,1354,18384,16167,3640,271,8801,124,5585,1969,2078,156,372,4031,1249,5513,6077,397,32334,14396,3300,100,24530,15788,271,6314,2003,1008,18726,156,2003,1837,43,8292,2145,2078,14138,31489,2078,156,3030,7560,38877,755,6077,397,250,271,3515,5000,278,2141,287,533,986,1072,4031,3449,5254,343,4031,15933,2078,3261,2949,1615,2078,22524,3147,21273,271,469,8627,9510,156,546,4799,271,2078,156,5141,5934,2090,986,4527,8083,4799,16931,13779,259,4902,15870,14713,8407,9,10,271,8800,1836,1129,2745,193,271,300,273,4098,2942,539,4849,25419,14391,986,6357,3152,4257,6946,32334,14396,397,21473,4257,8125,104,4303,3515,5496,16694,271,4303,2753,4589,4257,4031,3742,397,3222,7533,1775,21618,1329,3260,8096,856,3770,6213,4031,2579,5563,1775,7078,5564,4773,3947,6639,250,79,856,856,1344,4031,2219,8395,773,329,1775,287,533,2975,3445,5074,5181,343,4031,533,4402,269,2141,3024,79,856,4031,355,11350,1837,269,2141,3038,11350,2992,287,5974,79,856,3053,1483,2232,287,3947,6381,70287,4111,856,320,3348,3609,4761,2927,4031,5074,648,12870,223,3522,324,1329,413,100,2665,6649,998,856,1950,2273,3955,435,7909,3118,20436,856,397,3928,7909,3537,27853,5812,3809,5494,490,7083,397,372,78700,3228,3601,4031,5074,856,6073,3866,3348,567,12589,104,7560,38877,755,2141,343,4031,1615,2078,156,12870,856,4902,12870,44851,7560,38877,755,2141,12870,4016,3343,501,768,14666,106,501,1128,2454,26189,9959,14666,501,355,2872,12870,278,475,5312,278,3658,38907,2880,7673,278,2141,12870,2941,2880,3187,5312,46585,1086,3299,741,38877,2967,1846,6077,278,397,31489,2077,2003,4362,156,3844,7035,2393,15767,186,1079,46585,846,1143,6678,329,9306,2881,3663,103,1967,299,1079,2003,1837,741,38877,2967,8640,1846,1967,1513,1836,4445,693,668,3174,6954,5282,43,12832,6214,11671,474,10459,12559,31697,6175,2992,4605,124,2003,13825,2181,3015,156,8801,216,474,43,741,38877,1483,343,2172,490,4031,2219,3696,1483,259,2172,2164,490,1143,1748,3071,4214,7331,12870,856,4902,3440,12870,5049,3449,5130,413,2208,3524,26354,3760,3751,397
+2098,2099,1641,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 463,393,287,533,12030,229,6421,3064,8273,463,8332,6971,5234,4111,2701,3929,1008,20395,873,223,3050,6279,2930,20516,463,223,14440,533,393,1014,463,2211,8587,173091,3187,3926,533,5788,172,393,287,533,4010,31,457,2864,229,1216,2992,3453,7709,2099,3522,3115,2099,4254,4176,6196,2099,2728,930,229,464,2881,6664,2099,4254,67,2023,1754,37158,613,3310,929,271,3493,464,3759,221,902,3024,1837,3926,533,5788,2099,2728,930,229,464,2927,259,136,3071,184810,223,930,3013,538,3767,67,172,3043,3926,67,2099,2728,870,546,2794,3330,930,334,3862,8632,12414,2320,1676,11314,2099,37158,613,67,2911,3310,37158,613,4706,2992,568,15,463,2023,1754,1355,6229,2501,1423,2270,393,287,533,3879,533,940,106,463,93553,4587,5248,15,533,1960,20395,873,533,5788,1129,1065,91,7244,15663,463,223,3797,2320,24350,2211,6904,9603,36815,533,5788,3202,184811,2320,24350,2992,343,355,533,5788,2310,6971,2099,8332,223,6971,3700,2996,2098,6971,114,1601,4838,2701,3495,8332,6971,5581,4111,2701,3929,1008,141,2657,20395,873,23985,3695,4663,273,463,223,3797,4998,2099,2211,3197,74209,1735,533,1960,184811,960,1111,2099,8332,3929,2992,259,1003,2886,7091,7051,873,464,6193,2968,67,4729,223,172,3043,1754,3330,2996,141,2657,20395,873,23985,93706,4663,273,463,223,3797,2320,24350,2211,23845,4070,223,3202,172,2320,24350,5788,6971,3700,1601,2992,2310,6971,2996,4838,343,355,533,2099,8332,223,2098,6971,114,2701,3495,223,3797,2320,24350,2211,1757,4663,2141,533,3682,452,184811,2320,24350,2992,343,355,533,5788,2310,6971,2099,8332,223,6971,3700,2996,2098,6971,114,1601,4838,2701,3495,8332,6971,5581,4111,2701,3929,1008,1530,259,136,3071,1530,610,1551,1657,24258,1530,259,1003,2886,1530,33839,757,445,2630,3224,24258,1530,223,3797,184810,2211,24663,95868,51888,373,287,1960,184811,259,136,3071,184810,223,85248,15180,1734,6698,2434,2790,2099,2968,3071,67,4729,223,172,3043,259,136,3071,1530,610,1551,1657,24258,1530,223,3797,4078,18079,7557,1833,93,2211,65254,14969,223,729,184811,2695,2320,780,2206,223,6820,2968,780,32,3663,15,940,501,3771,2996,1734,6698,435,2099,1960,2968,4673,3310,67,4729,223,172,3043,259,1003,184812,1530,33839,757,445,2630,3224,24258,1530,223,3797,37158,1229,2211,24663,95868,4507,373,287,1960,184811,37158,1229,37158,613,6411,2992,501,1748,323,259,136,3071,1834,7879,2424,3204,4127,613,101,7789,1284,6820,3918,3897,3529,505,3328,93,856,323,136,1530,1551,1657,24258,1530,223,3797,4998,2099,6196,190,3492,2211,33211,115001,2099
+2142,2143,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 72890,4304,15680,5392,72890,4304,15680,5392,2143,16505,259,2922,4533,1944,55796,2393,3090,10374,773,5237,4306,4405,76240,7029,1280,4315,8912,26583,620,1111,2922,489,17730,944,25931,4804,15029,14203,3114,17960,23644,525,39476,3471,2143,67540,5427,4643,1943,50546,378,456,55796,35133,1451,4250,4211,827,50,78105,33886,4880,4942,72890,1908,3782,104,3090,5070,4218,5313,1859,1978,1451,489,2325,22474,764,2316,10635,187,1496,13983,140,5261,5262,1351,435,3147,4804,1402,3676,5132,686,673,2148,24216,5674,2753,15271,2922,2143,25931,1018,15077,4118,4589,2922,3765,3766,764,1183,5341,2143,3565,2190,1071,546,104,1038,25797,1264,59665,4748,2143,4761,20829,8083,1617,1130,3099,15787,2143,1943,759,946,912,84,4914,795,1662,634,3533,490,1335,3272,10374,773,50546,13922,3090,7664,14930,1921,1938,3311,489,3745,223,2759,21780,5312,50546,13922,3782,489,1662,10635,84,1944,5924,3766,17101,4230,26605,4459,489,4250,1072,4118,2143,16498,3745,456,55796,4533,1944,3765,12144,773,3557,259,50546,3071,3453,2143,2842,2190,1129,11404,3123,3258,229,1018,479,6284,1733,5403,4250,2171,78105,33886,3090,375,17298,1483,187,3106,3135,862,187,1475,355,2088,55796,5237,6354,3988,4063,2754,5310,55796,2185,4113,489,4250,1795,3090,14930,828,12576,147905,18384,4019,1420,1129,34592,17298,3261,7594,11862,567,117120,63548,38450,3757,934,4992,722,14218,20880,3745,5221,4880,2192,72890,5237,22496,20215,27018,2340,1129,34592,229,91,435,980,3086,8727,259,50546,3071,2753,2922,2143,14875,81,4187,609,7370,8083,1131,2122,2638,2966,2784,2143,22767,2839,609,7370,23644,525,756,35272,5644,3586,2959,11404,2143,3090,5850,2149,229,1371,1018,49424,1214,4279,1145,1018,1420,4129,4120,4445,50546,8083,1033,3783,4258,4455,39366,773,772,2143,65081,76240,99156,371,1726,20079,8281,27494,16697,1037,3090,14930,5076,6538,72890,3882,3063,13998,18238,2522,2316,20880,4230,20880,2192,5221,1746,6524,4459,76240,4432,17730,4322,4804,18930,14876,72890,2252,3745,187,4113,489,4250,187,4647,3122,16888,2252,1183,84,3063,5191,3922,4172,13998,18238,7428,13859,3783,10901,6423,14930,3471,3807,7482,4247,4392,2396,1729,2396,4828,535,3807,1694,29212,4084,2977,4113,489,4250,2088,55796,2674,15040,2396,14930,3261,1065,4181,3122,4084,2252,5191,3922,11622,3783,1790,95832,2396,4828,3581,187,4222,2967,827,1139,4862,1938,2717,29212,4250,1404,72890,7752,489,4250,8798,8222,2396,3807,67,55796,2952,1733,1139,1431,489,4250,3030,50,828,6479,2143,5184,3608,50,828,1531,1761,3326,14908,3745,3090,17298,5237,11097,147905,1018,456,20880,4992,4607,17723,394,2396,4250,18238,4878,30347,3259,23644,4943,10635,147905,3807
+699,2155,2156,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 46891,2211,533,2366,31,7801,1111,3657,3038,253,535,4281,1043,2927,1524,3039,560,253,1837,4218,2310,2558,285,3651,5070,7801,1111,3657,1214,173132,46891,173132,4247,1733,6387,5796,699,452,3771,3536,1111,3445,452,699,1548,71083,535,71083,533,2366,253,1012,2565,3783,934,3219,780,3771,2211,3291,699,501,355,699,7051,6225,535,21122,1970,699,2155,3651,17475,271,300,3771,26327,393,1501,5426,2211,393,3014,699,501,355,1501,697,335,13676,7222,50992,17385,1877,31,1548,452,3233,1826,3603,6474,3038,1877,253,2974,2176,2794,3897,4529,1548,7801,1111,3657,3038,253,535,4281,1043,2927,3039,560,253,5232,4218,2310,2558,285,3651,5070,7801,1111,3657,1214,1548,452,355,106772,2369,817,67,3616,699,2155,2156,533,1877,1214,2980,1548,26361,27339,59621,375,1548,3907,6262,438,253,3219,780,3471,355,3471,355,1012,697,335,2705,13676,7222,50992,15336,17385,1548,1877,3451,343,2611,3451,1548,533,3451,3651,2168,17475,271,300,413,699,3451,2948,40,2611,2162,2881,1548,699,3771,274,3291,1131,3233,31,2211,1043,3135,1524,3039,46891,1043,3135,3536,3233,986,5203,27355,3310,4010,31,10317,634,3024,1042,1524,3039,2862,46891,3233,13942,3024,3273,3930,91837,1694,2028,271,1548,264,3233,1985,46891,3233,1826,2566,2794,264,3918,6229,6231,295,1676,3870,2388,1161,2565,3903,1746,67,3233,464,67,1008,1111,3657,3603,959,253,3038,1111,3657,560,464,5549,5511,2896,464,3705,846,3651,4638,4752,3841,3928,3651,846,3441,1085,3696,3651,3759,3779,1740,464,2400,1676,4430,4752,5974,4140,4003,5232,834,858,36959,46891,934,2470,47772,377,81,271,699,934,5569,154,5779,10317,2211,3158,699,2814,46891,2211,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+941,942,535,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 3115,1055,152,4990,4920,6108,3315,3115,1484,6206,31704,51421,7228,86552,6814,146751,1654,6934,146752,16588,146753,64125,4568,172,941,942,11673,18449,6359,3259,1832,6131,27898,1381,1381,3346,10371,1856,941,942,8153,1825,941,942,4082,1825,941,942,930,8139,4082,1832,8153,1232,8209,184,941,942,1832,8061,941,942,4758,3897,2339,3299,941,942,4227,555,930,8139,4082,5037,8125,8209,8055,184,23456,941,942,941,942,3322,3545,3498,5279,8209,11981,1674,23456,2753,2663,1232,1712,3158,1114,1646,2814,8175,86553,1055,2525,2817,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+93,36,2459,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 31874,3458,3038,253,3458,3038,253,506,31874,741,59672,2141,44677,2322,2974,491,2322,7461,3841,741,59672,3744,760,5286,29800,699,377,15192,5286,1048,7816,5286,29800,29800,377,557,1474,31,3841,778,5286,29800,1367,8211,722,271,93,1388,3903,3466,31874,3466,93,7801,6412,355,10317,7801,6412,355,2862,4308,1367,1481,2176,175,1790,3810,1228,3532,7801,6412,355,3038,5229,4003,7801,6412,355,3881,93,4003,7801,6412,355,3458,3038,253,4003,7801,6412,355,93,4003,7801,6412,355,2566,3525,4003,7801,6412,355,2181,1526,4003,7801,6412,355,650,4364,4003,7801,6412,355,6232,67,4003,7801,6412,355,2470,93,4003,7801,6412,355,271,4003,7801,6412,355,1531,93,37,14334,1159,37,14334,699,4484,4003,36959,7801,6412,355,31874,7801,6412,355,2211,67,253,7801,6412,355,1321,1367,8211,722,271,93,1388,3903,3466,31874,535,650,4364,3859,6232,67,11731,4113,1149,3344,1581,1524,3039,1141,3024,6194,271,6648,93,3466,435,1581,650,4364,4003,7801,6412,355,31874,3668,271,6648,93,1581,3466,31874,271,6648,93,4113,535,1149,3344,4720,3024,7113,1524,3039,6194,271,6648,93,2252,4171,1367,3258,6648,93,7801,6412,355,3848,377,1048,6232,67,11731,1048,2839,3344,650,4364,5254,10083,2176,5062,3224,186,567,3207,1143,535,20807,1149,2952,5644,3231,535,5644,3823,3800,3224,3516,5207,4872,1524,3039,1141,3235,4308,1524,3039,1141,650,4364,175,1048,3466,1048,2839,3344,1746,1149,3344,4364,3516,1149,3344,1048,5644,1048,1149,4642,1581,1048,1746,8317,413,3546,1149,4642,1407,1143,1149,3344,3516,1149,3344,1048,4586,3509,1048,5644,1048,3509,1581,1048,1746,8317,413,3546,3509,1149,3344,3771,1048,4586,1321,3930,5963,3466,93,7801,6412,355,1048,3466,93,11731,3556,6168,3700,6648,93,4642,3313,1516,14456,6648,93,3258,3525,6689,113,6648,93,3525,3258,3466,5584,4813,3297,10352,3323,4308,6380,5495,1321,3930,10317,7801,6412,355,2862,10317,2862,6232,67,11731,650,4364,3859,3024,1524,3039,6194,271,3916,2862,2863,3496,8673,104,535,4003,1321,3930,5963,4308,1367,1481,2176,175,1790,3810,535,4241,3881,3768,20860,264,222,18576,780,26640,5328,31874,934,2176,2119,3258,377,1321,3930,1228,3532,7801,6412,355,1228,3532,23900,1424,2996,3096,3834,6130,4638,1349,4752,1159,67,7801,6412,355,31874,23900,7801,6196,320,36959,31874,1321,3930,5963,3038,5229,4003,7801,6412,355,4003,7801,6412,355,31874,4938,3038,5229,253,6387,3024,3536,5203,699,464,2162,3881,253,3038,3330,1837,253,535,4003,1048,3038,5229,11731,3466,253,2470,2009,253,253,1970,2316,2681,15716,3216,1143,764,5232,1048
+334,35,418,201,419,420,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 8313,3524,611,613,35,20866,15047,39283,37364,6279,94700,420,4016,3906,2176,3840,2913,1834,462,611,2103,987,2646,32463,22656,2949,5494,35,535,535,35,2111,1386,2856,34,35,1526,419,2560,5656,2665,174251,695,174251,67,1955,1432,35,611,535,858,3840,1955,1432,35,611,535,858,174251,4241,1799,35,611,535,858,3446,2133,2424,1834,5962,6167,3609,535,611,613,35,3250,420,475,35,535,2560,5656,2665,6649,6078,420,858,46,1432,287,15,1008,2316,2681,174251,3446,664,1834,15,1955,371,2908,858,773,4568,5962,660,3557,174251,413,867,3872,4729,67,174251,1043,2927,773,1008,3158,1955,2814,858,934,14753,253,858,32287,229,4851,371,174251,4010,773,2968,37,3158,2117,2322,4195,2084,67,2023,355,4016,139,435,611,535,2099,1955,3640,1950,535,1432,6337,462,2099,2898,285,2133,2424,6715,225,1327,2029,6495,2424,3860,2424,773,987,611,285,3192,858,435,3519,6450,35,2968,6264,1770,15,6376,1834,2560,6080,2968,35,4585,6376,1834,4539,1770,15,3122,4645,293,456,1730,480,81939,2646,3261,3015,986,1955,1834,535,1955,1834,3580,1039,174251,253,2553,535,2111,1386,2856,34,35,104,653,966,2424,1834,773,3768,2111,1386,535,1039,2424,1834,939,966,2913,2424,773,3768,2856,3118,2913,2424,3768,34,35,2229,4976,578,6080,4148,2331,35,535,2560,2665,1834,1730,1834,2560,578,5513,15,1955,1432,35,611,535,858,2913,1834,535,35,3014,2176,9160,660,1752,535,2424,103,858,1329,6339,5494,35,535,419,420,4589,2991,535,3446,858,3192,174251,4010,773,2968,2322,4195,2084,14087,535,2725,3030,5494,2391,10921,673,3083,773,2424,418,343,1834,809,35,535,419,420,6339,2913,1432,5890,4493,2908,4536,2408,858,61743,343,858,3013,4031,931,397,106,338,174251,61743,858,2921,4589,2991,5366,4589,858,1329,3234,535,14087,2725,3030,67,61743,858,361,3233,3158,129129,2117,4016,462,2913,1834,2424,3295,3419,1327,1955,1834,2320,462,2898,285,174251,61743,3419,966,1955,966,1955,1432,35,611,535,858,6408,418,773,2320,462,2898,285,462,1955,2162,773,2320,462,2898,3295,1955,3295,3216,687,2292,3216,687,7888,6337,462,2099,3588,5323,4356,2424,3035,1327,2029,2099,6337,2424,2424,2099,6337,5323,104,734,3295,174251,3030,462,2099,2424,3589,343,858,4536,2408,61743,1986,175,3926,533,101886,4720,462,535,435,2914,229,1802,280,2391,9,139,535,490,2927,4605,101886,3703,3548,5009,535,4016,611,2913,2424,67148,3295,3295,1327,1955,1834,20358,611,2898,285,174251,61743,966,1955,966,1955,1432,35,611,535,858,6408,418,1955,611
+2296,1141,1,579,1055,49,373,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 373,1373,1141,1055,23507,23507,1986,271,52761,373,1373,1141,1055,23507,23507,1986,271,52761,332,373,1373,1141,1055,23507,23507,1986,271,52761,373,1373,1141,1055,23507,23507,1986,271,52761,975,15631,295,975,2176,373,1373,3031,3752,4484,7688,52066,21674,1105,271,52761,1054,373,1373,7029,4507,373,90904,3748,33851,3791,9460,17661,101532,23507,1986,271,52761,373,1373,4507,373,90904,1402,9460,17661,101532,1141,1483,413,1055,23507,23507,1986,271,52761,373,1373,1141,1483,413,1055,23507,23507,1986,271,52761,373,1373,1141,1055,23507,23507,1986,271,52761,373,1373,16220,1162,9460,17661,8079,101540,101532,3014,1141,1483,413,1055,23507,271,52761,1054,373,25037,7121,11120,7823,1195,1055,271,52761,1054,373,16796,4507,373,4508,403,3928,14529,2769,4336,71,2211,579,1055,579,1055,901,579,1055,16,579,1055,411,1111,5569,2228,1111,377,81,2688,3954,1524,1524,1524,19978,2814,39374,12910,271,975,1582,3836,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+233,1662,165,425,229,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 425,229,393,469,1335,295,47536,1335,494,2177,9509,1431,51,2177,425,229,1093,1559,1400,3458,3038,253,4511,2312,645,469,2691,1216,940,120,3701,5513,229,2200,1968,1268,2853,425,1662,2028,6140,2211,9094,5725,3929,10061,303,7261,18089,50521,287,67,851,26231,4993,1268,2853,425,1662,938,229,2200,2982,2888,531,1400,494,6732,1968,10202,9391,103,425,1662,1968,3122,1968,10202,4098,25625,2945,340,802,425,229,393,469,3929,1713,773,103,1662,1597,768,1268,10202,808,10971,1268,10070,103,479,2871,445,229,2200,3653,3930,425,1662,233,1662,479,2871,3848,3158,47536,1646,2814,51,425,1662,4218,2945,6185,4627,4016,3508,165,25625,1597,425,1662,3122,1968,3308,2331,41,802,425,1662,2945,802,340,2926,9711,59,4335,2190,116800,856,4905,233,763,1159,3123,3971,2865,4417,1506,3236,10070,4016,295,47536,1335,265,47536,51,340,377,459,2211,47536,47536,457,47536,934,3158,47536,1646,2814,1335,3388,3729,3213,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367
+1818,23,1819,1820,4,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367,193367 8107,4010,3967,21299,535,295,695,3906,867,3916,3027,1199,3440,1826,8107,856,14087,3875,3930,3916,15652,1503,3565,3235,3881,357,10551,3565,10551,535,26999,13706,13706,5236,187,5062,20,828,13998,828,2909,2959,1720,578,13706,55968,3295,8623,13706,55968,3295,827,13706,55968,827,13706,55968,66941,13706,55968,3909,1179,13464,7841,5004,31861,575,4250,13706,87811,13706,90701,13706,33043,7283,434,828,13998,828,3834,113,13706,33043,1970,33,10901,828,1720,535,57421,4218,3068,3896,13700,2701,828,6354,3699,3758,434,3896,8293,20602,29223,33043,3068,14040,2325,2396,3473,20,15587,2325,4254,20,828,2396,2405,5366,2029,2325,26,14038,4064,567,602,293,26,2909,113,20602,29223,33043,10639,870,3586,2325,26,2316,3834,113,33043,14394,33043,33119,33043,434,828,3967,3353,809,2405,16985,15587,413,2325,602,4589,26,3341,1385,456,1791,780,1181,20,15587,3471,29207,13706,33043,25148,33043,2888,3852,20,828,6354,12969,6340,13700,3896,456,2888,3852,3030,1039,828,6354,1524,42132,33043,3480,3757,42132,20,15587,3757,10666,1143,113,3244,2270,828,20,2909,113,42132,33043,10639,870,2270,42132,3834,113,2252,30536,42132,33043,4647,30536,42132,33043,3693,42132,33043,13706,1823,11289,1264,382,20,13706,1008,3834,113,7551,1823,14147,6647,1823,140392,13706,1008,5927,9736,5335,7483,4970,13998,828,1644,20,4392,4991,29815,1823,1008,1823,1008,3537,3043,13706,1008,2454,13706,1008,1284,3583,1823,33043,1422,175,11124,17260,6076,3583,3123,3305,320,1008,3756,4947,13706,321,13706,1820,10617,1820,14163,768,5821,2580,6539,12615,5100,11321,20,14147,140393,5827,3523,2589,828,10193,10270,865,3048,31027,90835,33,3809,1819,1820,1551,5431,2395,1551,5431,750,2395,2241,1551,5431,1558,827,8295,20334,750,4391,489,3269,13025,2959,1034,750,1551,5431,2395,3970,18615,10617,3785,4249,489,2357,186,8295,750,3637,1385,489,1551,5431,750,2395,1551,5431,2395,1551,6567,67533,13558,20293,13558,2921,1008,21309,2395,2820,2966,3339,14172,11287,827,5564,1551,10987,118110,27670,2440,2888,221,3703,3609,30833,420,557,20,21526,5887,20,221,10,9028,293,3508,20,828,20,1409,3852,6354,502,1409,3852,20,2488,26,828,3974,20,293,20782,26,21772,4398,10081,3745,3921,9304,4315,382,5551,3589,3834,11289,491,6479,1253,3835,29650,3547,50,2753,7198,595,6303,52,1008,7080,1253,2961,38818,2325,535,52,2254,15905,4051,52,21772,10059,17464,3745,10393,71042,4218,6135,3994,2952,382,2753,382,10059,30521,1218,20464,1823,50,15216,16501,21772,20995,10059,1250,2881,648,2719,382,2753,2974,6501,382,10059,13949,197,20,30521,2760,1250,3745,648,382,2022,7777,1250,8080,491,2669
diff --git a/models/match/match-pyramid/data_process.sh b/models/match/match-pyramid/data_process.sh
new file mode 100644
index 0000000000000000000000000000000000000000..dfd3a8748a98aecdc7e89fb8f4c461740286f8e4
--- /dev/null
+++ b/models/match/match-pyramid/data_process.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+echo "...........load data................."
+wget --no-check-certificate 'https://paddlerec.bj.bcebos.com/match_pyramid/match_pyramid_data.tar.gz'
+mv ./match_pyramid_data.tar.gz ./data
+rm -rf ./data/relation.test.fold1.txt ./data/realtion.train.fold1.txt
+tar -xvf ./data/match_pyramid_data.tar.gz
+echo "...........data process..............."
+python ./data/process.py
diff --git a/models/match/match-pyramid/eval.py b/models/match/match-pyramid/eval.py
new file mode 100644
index 0000000000000000000000000000000000000000..dae40cef13943051bc993327cbdaf39486d2b48f
--- /dev/null
+++ b/models/match/match-pyramid/eval.py
@@ -0,0 +1,72 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
+
+import random
+import numpy as np
+
+
+def eval_MAP(pred, gt):
+ map_value = 0.0
+ r = 0.0
+ c = list(zip(pred, gt))
+ random.shuffle(c)
+ c = sorted(c, key=lambda x: x[0], reverse=True)
+ for j, (p, g) in enumerate(c):
+ if g != 0:
+ r += 1
+ map_value += r / (j + 1.0)
+ if r == 0:
+ return 0.0
+ else:
+ return map_value / r
+
+
+filename = './data/relation.test.fold1.txt'
+gt = []
+qid = []
+f = open(filename, "r")
+f.readline()
+num = 0
+for line in f.readlines():
+ num = num + 1
+ line = line.strip().split()
+ gt.append(int(line[0]))
+ qid.append(line[1])
+f.close()
+print(num)
+filename = './result.txt'
+pred = []
+for line in open(filename):
+ line = line.strip().split(",")
+ line[1] = line[1].split(":")
+ line = line[1][1].strip(" ")
+ line = line.strip("[")
+ line = line.strip("]")
+ pred.append(float(line))
+
+result_dict = {}
+for i in range(len(qid)):
+ if qid[i] not in result_dict:
+ result_dict[qid[i]] = []
+ result_dict[qid[i]].append([gt[i], pred[i]])
+print(len(result_dict))
+
+map = 0
+for qid in result_dict:
+ gt = np.array(result_dict[qid])[:, 0]
+ pred = np.array(result_dict[qid])[:, 1]
+ map += eval_MAP(pred, gt)
+map = map / len(result_dict)
+
+print("map=", map)
diff --git a/models/match/match-pyramid/model.py b/models/match/match-pyramid/model.py
new file mode 100644
index 0000000000000000000000000000000000000000..6abd1503ab29a851f93378e8a51f31b7c84a2225
--- /dev/null
+++ b/models/match/match-pyramid/model.py
@@ -0,0 +1,142 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
+
+import os
+import sys
+import random
+import numpy as np
+import paddle
+import paddle.fluid as fluid
+from paddlerec.core.utils import envs
+from paddlerec.core.model import ModelBase
+
+
+class Model(ModelBase):
+ def __init__(self, config):
+ ModelBase.__init__(self, config)
+
+ def _init_hyper_parameters(self):
+ self.emb_path = envs.get_global_env("hyper_parameters.emb_path")
+ self.sentence_left_size = envs.get_global_env(
+ "hyper_parameters.sentence_left_size")
+ self.sentence_right_size = envs.get_global_env(
+ "hyper_parameters.sentence_right_size")
+ self.vocab_size = envs.get_global_env("hyper_parameters.vocab_size")
+ self.emb_size = envs.get_global_env("hyper_parameters.emb_size")
+ self.kernel_num = envs.get_global_env("hyper_parameters.kernel_num")
+ self.hidden_size = envs.get_global_env("hyper_parameters.hidden_size")
+ self.hidden_act = envs.get_global_env("hyper_parameters.hidden_act")
+ self.out_size = envs.get_global_env("hyper_parameters.out_size")
+ self.channels = envs.get_global_env("hyper_parameters.channels")
+ self.conv_filter = envs.get_global_env("hyper_parameters.conv_filter")
+ self.conv_act = envs.get_global_env("hyper_parameters.conv_act")
+ self.pool_size = envs.get_global_env("hyper_parameters.pool_size")
+ self.pool_stride = envs.get_global_env("hyper_parameters.pool_stride")
+ self.pool_type = envs.get_global_env("hyper_parameters.pool_type")
+ self.pool_padding = envs.get_global_env(
+ "hyper_parameters.pool_padding")
+
+ def input_data(self, is_infer=False, **kwargs):
+ sentence_left = fluid.data(
+ name="sentence_left",
+ shape=[-1, self.sentence_left_size, 1],
+ dtype='int64',
+ lod_level=0)
+ sentence_right = fluid.data(
+ name="sentence_right",
+ shape=[-1, self.sentence_right_size, 1],
+ dtype='int64',
+ lod_level=0)
+ return [sentence_left, sentence_right]
+
+ def embedding_layer(self, input):
+ """
+ embedding layer
+ """
+ if os.path.isfile(self.emb_path):
+ embedding_array = np.load(self.emb_path)
+ emb = fluid.layers.embedding(
+ input=input,
+ size=[self.vocab_size, self.emb_size],
+ padding_idx=0,
+ param_attr=fluid.ParamAttr(
+ name="word_embedding",
+ initializer=fluid.initializer.NumpyArrayInitializer(
+ embedding_array)))
+ else:
+ emb = fluid.layers.embedding(
+ input=input,
+ size=[self.vocab_size, self.emb_size],
+ padding_idx=0,
+ param_attr=fluid.ParamAttr(
+ name="word_embedding",
+ initializer=fluid.initializer.Xavier()))
+
+ return emb
+
+ def conv_pool_layer(self, input):
+ """
+ convolution and pool layer
+ """
+ # data format NCHW
+ # same padding
+ conv = fluid.layers.conv2d(
+ input=input,
+ num_filters=self.kernel_num,
+ stride=1,
+ padding="SAME",
+ filter_size=self.conv_filter,
+ act=self.conv_act)
+ pool = fluid.layers.pool2d(
+ input=conv,
+ pool_size=self.pool_size,
+ pool_stride=self.pool_stride,
+ pool_type=self.pool_type,
+ pool_padding=self.pool_padding)
+ return pool
+
+ def net(self, inputs, is_infer=False):
+ left_emb = self.embedding_layer(inputs[0])
+ right_emb = self.embedding_layer(inputs[1])
+ cross = fluid.layers.matmul(left_emb, right_emb, transpose_y=True)
+ cross = fluid.layers.reshape(cross,
+ [-1, 1, cross.shape[1], cross.shape[2]])
+ conv_pool = self.conv_pool_layer(input=cross)
+ relu_hid = fluid.layers.fc(input=conv_pool,
+ size=self.hidden_size,
+ act=self.hidden_act)
+ prediction = fluid.layers.fc(
+ input=relu_hid,
+ size=self.out_size, )
+
+ if is_infer:
+ self._infer_results["prediction"] = prediction
+ return
+
+ pos = fluid.layers.slice(
+ prediction, axes=[0, 1], starts=[0, 0], ends=[64, 1])
+ neg = fluid.layers.slice(
+ prediction, axes=[0, 1], starts=[64, 0], ends=[128, 1])
+ loss_part1 = fluid.layers.elementwise_sub(
+ fluid.layers.fill_constant(
+ shape=[64, 1], value=1.0, dtype='float32'),
+ pos)
+ loss_part2 = fluid.layers.elementwise_add(loss_part1, neg)
+ loss_part3 = fluid.layers.elementwise_max(
+ fluid.layers.fill_constant(
+ shape=[64, 1], value=0.0, dtype='float32'),
+ loss_part2)
+
+ avg_cost = fluid.layers.mean(loss_part3)
+ self._cost = avg_cost
diff --git a/models/match/match-pyramid/readme.md b/models/match/match-pyramid/readme.md
new file mode 100644
index 0000000000000000000000000000000000000000..c0aaa483d1517cd8cb61e45dddb94716c7ec9639
--- /dev/null
+++ b/models/match/match-pyramid/readme.md
@@ -0,0 +1,94 @@
+# match-pyramid文本匹配模型
+
+## 介绍
+在许多自然语言处理任务中,匹配两个文本是一个基本问题。一种有效的方法是从单词,短语和句子中提取有意义的匹配模式以产生匹配分数。受卷积神经网络在图像识别中的成功启发,神经元可以根据提取的基本视觉模式(例如定向的边角和边角)捕获许多复杂的模式,所以我们尝试将文本匹配建模为图像识别问题。本模型对齐原作者庞亮开源的tensorflow代码:https://github.com/pl8787/MatchPyramid-TensorFlow/blob/master/model/model_mp.py, 实现了下述论文中提出的Match-Pyramid模型:
+
+```text
+@inproceedings{Pang L , Lan Y , Guo J , et al. Text Matching as Image Recognition[J]. 2016.,
+ title={Text Matching as Image Recognition},
+ author={Liang Pang, Yanyan Lan, Jiafeng Guo, Jun Xu, Shengxian Wan, Xueqi Cheng},
+ year={2016}
+}
+```
+
+## 数据准备
+训练及测试数据集选用Letor07数据集和 embed_wiki-pdc_d50_norm 词向量初始化embedding层。
+该数据集包括:
+1.词典文件:我们将每个单词映射得到一个唯一的编号wid,并将此映射保存在单词词典文件中。例如:word_dict.txt
+2.语料库文件:我们使用字符串标识符的值表示一个句子的编号。第二个数字表示句子的长度。例如:qid_query.txt和docid_doc.txt
+3.关系文件:关系文件被用来存储两个句子之间的关系,如query 和document之间的关系。例如:relation.train.fold1.txt, relation.test.fold1.txt
+4.嵌入层文件:我们将预训练的词向量存储在嵌入文件中。例如:embed_wiki-pdc_d50_norm
+
+## 数据下载和预处理
+本文提供了数据集的下载以及一键生成训练和测试数据的预处理脚本,您可以直接一键运行:bash data_process.sh
+执行该脚本,会从国内源的服务器上下载Letor07数据集,删除掉data文件夹中原有的relation.test.fold1.txt和relation.train.fold1.txt,并将完整的数据集解压到data文件夹。随后运行 process.py 将全量训练数据放置于`./data/train`,全量测试数据放置于`./data/test`。并生成用于初始化embedding层的embedding.npy文件
+执行该脚本的理想输出为:
+```
+bash data_process.sh
+...........load data...............
+--2020-07-13 13:24:50-- https://paddlerec.bj.bcebos.com/match_pyramid/match_pyramid_data.tar.gz
+Resolving paddlerec.bj.bcebos.com... 10.70.0.165
+Connecting to paddlerec.bj.bcebos.com|10.70.0.165|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 214449643 (205M) [application/x-gzip]
+Saving to: “match_pyramid_data.tar.gz”
+
+100%[==========================================================================================================>] 214,449,643 114M/s in 1.8s
+
+2020-07-13 13:24:52 (114 MB/s) - “match_pyramid_data.tar.gz” saved [214449643/214449643]
+
+data/
+data/relation.test.fold1.txt
+data/relation.test.fold2.txt
+data/relation.test.fold3.txt
+data/relation.test.fold4.txt
+data/relation.test.fold5.txt
+data/relation.train.fold1.txt
+data/relation.train.fold2.txt
+data/relation.train.fold3.txt
+data/relation.train.fold4.txt
+data/relation.train.fold5.txt
+data/relation.txt
+data/docid_doc.txt
+data/qid_query.txt
+data/word_dict.txt
+data/embed_wiki-pdc_d50_norm
+...........data process...............
+[./data/word_dict.txt]
+ Word dict size: 193367
+[./data/qid_query.txt]
+ Data size: 1692
+[./data/docid_doc.txt]
+ Data size: 65323
+[./data/embed_wiki-pdc_d50_norm]
+ Embedding size: 109282
+('Generate numpy embed:', (193368, 50))
+[./data/relation.train.fold1.txt]
+ Instance size: 47828
+('Pair Instance Count:', 325439)
+[./data/relation.test.fold1.txt]
+ Instance size: 13652
+```
+
+## 一键训练并测试评估
+本文提供了一键执行训练,测试和评估的脚本,您可以直接一键运行:bash run.sh
+执行该脚本后,会执行python -m paddlerec.run -m ./config.yaml 命令开始训练并测试模型,将测试的结果保存到result.txt文件,最后通过执行eval.py进行评估得到数据的map指标
+执行该脚本的理想输出为:
+```
+..............test.................
+13651
+336
+('map=', 0.420878322843591)
+```
+
+## 每个文件的作用
+paddlerec可以:
+通过config.yaml规定模型的参数
+通过model.py规定模型的组网
+使用train_reader.py读取训练集中的数据
+使用test_reader.py读取测试集中的数据。
+本文额外提供:
+data_process.sh用来一键处理数据
+run.sh用来一键启动训练,直接得出测试结果
+eval.py通过保存的测试结果,计算map指标
+如需详细了解paddlerec的使用方法请参考https://github.com/PaddlePaddle/PaddleRec/blob/master/README_CN.md 页面下方的教程。
diff --git a/models/match/match-pyramid/run.sh b/models/match/match-pyramid/run.sh
new file mode 100644
index 0000000000000000000000000000000000000000..3eccc10a990d563ed1dd5db2ad8ec3a73042ee69
--- /dev/null
+++ b/models/match/match-pyramid/run.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+echo "................run................."
+python -m paddlerec.run -m ./config.yaml >result1.txt
+grep -A1 "prediction" ./result1.txt >./result.txt
+rm -f result1.txt
+python eval.py
diff --git a/models/match/match-pyramid/test_reader.py b/models/match/match-pyramid/test_reader.py
new file mode 100644
index 0000000000000000000000000000000000000000..2a36ff18f537f1da86189c1c13440086cadc6d74
--- /dev/null
+++ b/models/match/match-pyramid/test_reader.py
@@ -0,0 +1,39 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
+from __future__ import print_function
+
+from paddlerec.core.reader import ReaderBase
+
+
+class Reader(ReaderBase):
+ def init(self):
+ pass
+
+ def generate_sample(self, line):
+ """
+ Read the data line by line and process it as a dictionary
+ """
+
+ def reader():
+ """
+ This function needs to be implemented by the user, based on data format
+ """
+
+ features = line.strip('\n').split('\t')
+ doc1 = [int(word_id) for word_id in features[0].split(",")]
+ doc2 = [int(word_id) for word_id in features[1].split(",")]
+ features_name = ["doc1", "doc2"]
+ yield zip(features_name, [doc1] + [doc2])
+
+ return reader
diff --git a/models/match/match-pyramid/train_reader.py b/models/match/match-pyramid/train_reader.py
new file mode 100644
index 0000000000000000000000000000000000000000..ec9520945ddc5ad4eabcc7a3ac6511b22e495cd8
--- /dev/null
+++ b/models/match/match-pyramid/train_reader.py
@@ -0,0 +1,40 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
+
+from __future__ import print_function
+
+from paddlerec.core.reader import ReaderBase
+
+
+class Reader(ReaderBase):
+ def init(self):
+ pass
+
+ def generate_sample(self, line):
+ """
+ Read the data line by line and process it as a dictionary
+ """
+
+ def reader():
+ """
+ This function needs to be implemented by the user, based on data format
+ """
+
+ features = line.strip('\n').split('\t')
+ doc1 = [int(word_id) for word_id in features[0].split(",")]
+ doc2 = [int(word_id) for word_id in features[1].split(",")]
+ features_name = ["doc1", "doc2"]
+ yield zip(features_name, [doc1] + [doc2])
+
+ return reader
diff --git a/models/match/multiview-simnet/config.yaml b/models/match/multiview-simnet/config.yaml
index bff01ae660bb5262e099a53c594cd0244a3ccf06..d6e0af5b568280bf55480eae8d209cc3dd771903 100755
--- a/models/match/multiview-simnet/config.yaml
+++ b/models/match/multiview-simnet/config.yaml
@@ -13,7 +13,7 @@
# limitations under the License.
# workspace
-workspace: "paddlerec.models.match.multiview-simnet"
+workspace: "models/match/multiview-simnet"
# list of dataset
dataset:
diff --git a/models/match/readme.md b/models/match/readme.md
index 38e72229a76de7c175d5177ee895bb114625ab48..5ca8cac2cbb9be3662cdd80cdbad5cf7abe8b6cd 100755
--- a/models/match/readme.md
+++ b/models/match/readme.md
@@ -34,8 +34,11 @@
## 使用教程(快速开始)
### 训练
```shell
-python -m paddlerec.run -m paddlerec.models.match.dssm # dssm
-python -m paddlerec.run -m paddlerec.models.match.multiview-simnet # multiview-simnet
+git clone https://github.com/PaddlePaddle/PaddleRec.git paddle-rec
+cd paddle-rec
+
+python -m paddlerec.run -m models/match/dssm/config.yaml # dssm
+python -m paddlerec.run -m models/match/multiview-simnet/config.yaml # multiview-simnet
```
### 预测
diff --git a/models/multitask/esmm/README.md b/models/multitask/esmm/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..91a1df7644f0768885030fc8fd0343d891ba29d1
--- /dev/null
+++ b/models/multitask/esmm/README.md
@@ -0,0 +1,122 @@
+# ESMM
+
+以下是本例的简要目录结构及说明:
+
+```
+├── data # 文档
+ ├── train #训练数据
+ ├──small.txt
+ ├── test #测试数据
+ ├── small.txt
+ ├── run.sh
+├── __init__.py
+├── config.yaml #配置文件
+├── esmm_reader.py #数据读取文件
+├── model.py #模型文件
+```
+
+注:在阅读该示例前,建议您先了解以下内容:
+
+[paddlerec入门教程](https://github.com/PaddlePaddle/PaddleRec/blob/master/README.md)
+
+## 内容
+
+- [模型简介](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/esmm#模型简介)
+- [数据准备](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/esmm#数据准备)
+- [运行环境](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/esmm#运行环境)
+- [快速开始](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/esmm#快速开始)
+- [论文复现](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/esmm#论文复现)
+- [进阶使用](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/esmm#进阶使用)
+- [FAQ](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/esmm#FAQ)
+
+## 模型简介
+
+不同于CTR预估问题,CVR预估面临两个关键问题:
+
+1. **Sample Selection Bias (SSB)** 转化是在点击之后才“有可能”发生的动作,传统CVR模型通常以点击数据为训练集,其中点击未转化为负例,点击并转化为正例。但是训练好的模型实际使用时,则是对整个空间的样本进行预估,而非只对点击样本进行预估。即是说,训练数据与实际要预测的数据来自不同分布,这个偏差对模型的泛化能力构成了很大挑战。
+2. **Data Sparsity (DS)** 作为CVR训练数据的点击样本远小于CTR预估训练使用的曝光样本。
+
+ESMM是发表在 SIGIR’2018 的论文[《Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate》]( https://arxiv.org/abs/1804.07931 )文章基于 Multi-Task Learning 的思路,提出一种新的CVR预估模型——ESMM,有效解决了真实场景中CVR预估面临的数据稀疏以及样本选择偏差这两个关键问题
+
+本项目在paddlepaddle上实现ESMM的网络结构,并在开源数据集[Ali-CCP:Alibaba Click and Conversion Prediction]( https://tianchi.aliyun.com/datalab/dataSet.html?dataId=408 )上验证模型效果, 本模型配置默认使用demo数据集,若进行精度验证,请参考[论文复现](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/esmm#论文复现)部分。
+
+本项目支持功能
+
+训练:单机CPU、单机单卡GPU、单机多卡GPU、本地模拟参数服务器训练、增量训练,配置请参考 [启动训练](https://github.com/PaddlePaddle/PaddleRec/blob/master/doc/train.md)
+
+预测:单机CPU、单机单卡GPU ;配置请参考[PaddleRec 离线预测](https://github.com/PaddlePaddle/PaddleRec/blob/master/doc/predict.md)
+
+## 数据准备
+
+数据地址:[Ali-CCP:Alibaba Click and Conversion Prediction]( https://tianchi.aliyun.com/datalab/dataSet.html?dataId=408 )
+
+```
+cd data
+sh run.sh
+```
+
+数据格式参见demo数据:data/train
+
+
+## 运行环境
+
+PaddlePaddle>=1.7.2
+
+python 2.7/3.5/3.6/3.7
+
+PaddleRec >=0.1
+
+os : windows/linux/macos
+
+## 快速开始
+
+### 单机训练
+
+CPU环境
+
+在config.yaml文件中设置好设备,epochs等。
+
+```
+dataset:
+ - name: dataset_train
+ batch_size: 5
+ type: QueueDataset
+ data_path: "{workspace}/data/train"
+ data_converter: "{workspace}/esmm_reader.py"
+ - name: dataset_infer
+ batch_size: 5
+ type: QueueDataset
+ data_path: "{workspace}/data/test"
+ data_converter: "{workspace}/esmm_reader.py"
+```
+
+### 单机预测
+
+CPU环境
+
+在config.yaml文件中设置好epochs、device等参数。
+
+```
+ - name: infer_runner
+ class: infer
+ init_model_path: "increment/1"
+ device: cpu
+ print_interval: 1
+ phases: [infer]
+```
+
+
+## 论文复现
+
+用原论文的完整数据复现论文效果需要在config.yaml中修改batch_size=1000, thread_num=8, epoch_num=4
+
+
+修改后运行方案:修改config.yaml中的'workspace'为config.yaml的目录位置,执行
+
+```
+python -m paddlerec.run -m /home/your/dir/config.yaml #调试模式 直接指定本地config的绝对路径
+```
+
+## 进阶使用
+
+## FAQ
diff --git a/models/multitask/esmm/config.yaml b/models/multitask/esmm/config.yaml
index d160f164455862912bc142d2b0bbd22042168d42..2a4478baa2052d03d6dd3699bc13ebba90583176 100644
--- a/models/multitask/esmm/config.yaml
+++ b/models/multitask/esmm/config.yaml
@@ -13,7 +13,7 @@
# limitations under the License.
-workspace: "paddlerec.models.multitask.esmm"
+workspace: "models/multitask/esmm"
dataset:
- name: dataset_train
diff --git a/models/multitask/esmm/data/run.sh b/models/multitask/esmm/data/run.sh
new file mode 100644
index 0000000000000000000000000000000000000000..c5698ffa5a54da51a4bbb673c4bb8a7d728a4901
--- /dev/null
+++ b/models/multitask/esmm/data/run.sh
@@ -0,0 +1,26 @@
+mkdir train_data
+mkdir test_data
+mkdir vocab
+mkdir data
+train_source_path="./data/sample_train.tar.gz"
+train_target_path="train_data"
+test_source_path="./data/sample_test.tar.gz"
+test_target_path="test_data"
+cd data
+echo "downloading sample_train.tar.gz......"
+curl -# 'http://jupter-oss.oss-cn-hangzhou.aliyuncs.com/file/opensearch/documents/408/sample_train.tar.gz?Expires=1586435769&OSSAccessKeyId=LTAIGx40tjZWxj6q&Signature=ahUDqhvKT1cGjC4%2FIER2EWtq7o4%3D&response-content-disposition=attachment%3B%20' -H 'Proxy-Connection: keep-alive' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' -H 'Accept-Language: zh-CN,zh;q=0.9' --compressed --insecure -o sample_train.tar.gz
+cd ..
+echo "unzipping sample_train.tar.gz......"
+tar -xzvf ${train_source_path} -C ${train_target_path} && rm -rf ${train_source_path}
+cd data
+echo "downloading sample_test.tar.gz......"
+curl -# 'http://jupter-oss.oss-cn-hangzhou.aliyuncs.com/file/opensearch/documents/408/sample_test.tar.gz?Expires=1586435821&OSSAccessKeyId=LTAIGx40tjZWxj6q&Signature=OwLMPjt1agByQtRVi8pazsAliNk%3D&response-content-disposition=attachment%3B%20' -H 'Proxy-Connection: keep-alive' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' -H 'Accept-Language: zh-CN,zh;q=0.9' --compressed --insecure -o sample_test.tar.gz
+cd ..
+echo "unzipping sample_test.tar.gz......"
+tar -xzvf ${test_source_path} -C ${test_target_path} && rm -rf ${test_source_path}
+echo "preprocessing data......"
+python reader.py --train_data_path ${train_target_path} \
+ --test_data_path ${test_target_path} \
+ --vocab_path vocab/vocab_size.txt \
+ --train_sample_size 6400 \
+ --test_sample_size 6400 \
diff --git a/models/multitask/mmoe/README.md b/models/multitask/mmoe/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..19f4674d97e56630acea2029396d12668e7dc3b1
--- /dev/null
+++ b/models/multitask/mmoe/README.md
@@ -0,0 +1,149 @@
+# MMOE
+
+ 以下是本例的简要目录结构及说明:
+
+```
+├── data # 文档
+ ├── train #训练数据
+ ├── train_data.txt
+ ├── test #测试数据
+ ├── test_data.txt
+ ├── run.sh
+ ├── data_preparation.py
+├── __init__.py
+├── config.yaml #配置文件
+├── census_reader.py #数据读取文件
+├── model.py #模型文件
+```
+
+注:在阅读该示例前,建议您先了解以下内容:
+
+[paddlerec入门教程](https://github.com/PaddlePaddle/PaddleRec/blob/master/README.md)
+
+## 内容
+
+- [模型简介](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/mmoe#模型简介)
+- [数据准备](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/mmoe#数据准备)
+- [运行环境](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/mmoe#运行环境)
+- [快速开始](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/mmoe#快速开始)
+- [论文复现](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/mmoe#论文复现)
+- [进阶使用](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/mmoe#进阶使用)
+- [FAQ](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/mmoe#FAQ)
+
+## 模型简介
+
+多任务模型通过学习不同任务的联系和差异,可提高每个任务的学习效率和质量。多任务学习的的框架广泛采用shared-bottom的结构,不同任务间共用底部的隐层。这种结构本质上可以减少过拟合的风险,但是效果上可能受到任务差异和数据分布带来的影响。 论文[《Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts》]( https://www.kdd.org/kdd2018/accepted-papers/view/modeling-task-relationships-in-multi-task-learning-with-multi-gate-mixture- )中提出了一个Multi-gate Mixture-of-Experts(MMOE)的多任务学习结构。MMOE模型刻画了任务相关性,基于共享表示来学习特定任务的函数,避免了明显增加参数的缺点。
+
+我们在Paddlepaddle定义MMOE的网络结构,在开源数据集Census-income Data上验证模型效果,两个任务的auc分别为:
+
+1.income
+
+> max_mmoe_test_auc_income:0.94937
+>
+> mean_mmoe_test_auc_income:0.94465
+
+2.marital
+
+> max_mmoe_test_auc_marital:0.99419
+>
+> mean_mmoe_test_auc_marital:0.99324
+
+若进行精度验证,请参考[论文复现](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/mmoe#论文复现)部分。
+
+本项目支持功能
+
+训练:单机CPU、单机单卡GPU、单机多卡GPU、本地模拟参数服务器训练、增量训练,配置请参考 [启动训练](https://github.com/PaddlePaddle/PaddleRec/blob/master/doc/train.md)
+预测:单机CPU、单机单卡GPU ;配置请参考[PaddleRec 离线预测](https://github.com/PaddlePaddle/PaddleRec/blob/master/doc/predict.md)
+
+## 数据准备
+
+数据地址: [Census-income Data](https://archive.ics.uci.edu/ml/machine-learning-databases/census-income-mld/census.tar.gz )
+
+数据解压后, 在run.sh脚本文件中添加文件的路径,并运行脚本。
+
+```sh
+mkdir train_data
+mkdir test_data
+mkdir data
+train_path="data/census-income.data"
+test_path="data/census-income.test"
+train_data_path="train_data/"
+test_data_path="test_data/"
+pip install -r requirements.txt
+wget -P data/ https://archive.ics.uci.edu/ml/machine-learning-databases/census-income-mld/census.tar.gz
+tar -zxvf data/census.tar.gz -C data/
+
+python data_preparation.py --train_path ${train_path} \
+ --test_path ${test_path} \
+ --train_data_path ${train_data_path}\
+ --test_data_path ${test_data_path}
+
+```
+
+生成的格式以逗号为分割点
+
+```
+0,0,73,0,0,0,0,1700.09,0,0
+```
+
+
+## 运行环境
+
+PaddlePaddle>=1.7.2
+
+python 2.7/3.5/3.6/3.7
+
+PaddleRec >=0.1
+
+os : windows/linux/macos
+
+## 快速开始
+
+### 单机训练
+
+CPU环境
+
+在config.yaml文件中设置好设备,epochs等。
+
+```
+dataset:
+- name: dataset_train
+ batch_size: 5
+ type: QueueDataset
+ data_path: "{workspace}/data/train"
+ data_converter: "{workspace}/census_reader.py"
+- name: dataset_infer
+ batch_size: 5
+ type: QueueDataset
+ data_path: "{workspace}/data/train"
+ data_converter: "{workspace}/census_reader.py"
+```
+
+### 单机预测
+
+CPU环境
+
+在config.yaml文件中设置好epochs、device等参数。
+
+```
+- name: infer_runner
+ class: infer
+ init_model_path: "increment/0"
+ device: cpu
+```
+
+## 论文复现
+
+用原论文的完整数据复现论文效果需要在config.yaml中修改batch_size=1000, thread_num=8, epoch_num=4
+
+使用gpu p100 单卡训练 6.5h 测试auc: best:0.9940, mean:0.9932
+
+修改后运行方案:修改config.yaml中的'workspace'为config.yaml的目录位置,执行
+
+```
+python -m paddlerec.run -m /home/your/dir/config.yaml #调试模式 直接指定本地config的绝对路径
+```
+
+## 进阶使用
+
+## FAQ
diff --git a/models/multitask/mmoe/config.yaml b/models/multitask/mmoe/config.yaml
index 63f052be105d969c2efa7a9c328fcfb05afdd3b9..9ba88de288c3111a1c581decc17e68c832ea6301 100644
--- a/models/multitask/mmoe/config.yaml
+++ b/models/multitask/mmoe/config.yaml
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-workspace: "paddlerec.models.multitask.mmoe"
+workspace: "models/multitask/mmoe"
dataset:
- name: dataset_train
diff --git a/models/multitask/mmoe/data/data_preparation.py b/models/multitask/mmoe/data/data_preparation.py
new file mode 100644
index 0000000000000000000000000000000000000000..ad0775d1d12c6a0e9069f6e90a96ec6882084da2
--- /dev/null
+++ b/models/multitask/mmoe/data/data_preparation.py
@@ -0,0 +1,118 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
+
+import pandas as pd
+import numpy as np
+import paddle.fluid as fluid
+from args import *
+
+
+def fun1(x):
+ if x == ' 50000+.':
+ return 1
+ else:
+ return 0
+
+
+def fun2(x):
+ if x == ' Never married':
+ return 1
+ else:
+ return 0
+
+
+def data_preparation(train_path, test_path, train_data_path, test_data_path):
+ # The column names are from
+ # https://www2.1010data.com/documentationcenter/prod/Tutorials/MachineLearningExamples/CensusIncomeDataSet.html
+ column_names = [
+ 'age', 'class_worker', 'det_ind_code', 'det_occ_code', 'education',
+ 'wage_per_hour', 'hs_college', 'marital_stat', 'major_ind_code',
+ 'major_occ_code', 'race', 'hisp_origin', 'sex', 'union_member',
+ 'unemp_reason', 'full_or_part_emp', 'capital_gains', 'capital_losses',
+ 'stock_dividends', 'tax_filer_stat', 'region_prev_res',
+ 'state_prev_res', 'det_hh_fam_stat', 'det_hh_summ', 'instance_weight',
+ 'mig_chg_msa', 'mig_chg_reg', 'mig_move_reg', 'mig_same',
+ 'mig_prev_sunbelt', 'num_emp', 'fam_under_18', 'country_father',
+ 'country_mother', 'country_self', 'citizenship', 'own_or_self',
+ 'vet_question', 'vet_benefits', 'weeks_worked', 'year', 'income_50k'
+ ]
+
+ # Load the dataset in Pandas
+ train_df = pd.read_csv(
+ train_path,
+ delimiter=',',
+ header=None,
+ index_col=None,
+ names=column_names)
+ other_df = pd.read_csv(
+ test_path,
+ delimiter=',',
+ header=None,
+ index_col=None,
+ names=column_names)
+
+ # First group of tasks according to the paper
+ label_columns = ['income_50k', 'marital_stat']
+
+ # One-hot encoding categorical columns
+ categorical_columns = [
+ 'class_worker', 'det_ind_code', 'det_occ_code', 'education',
+ 'hs_college', 'major_ind_code', 'major_occ_code', 'race',
+ 'hisp_origin', 'sex', 'union_member', 'unemp_reason',
+ 'full_or_part_emp', 'tax_filer_stat', 'region_prev_res',
+ 'state_prev_res', 'det_hh_fam_stat', 'det_hh_summ', 'mig_chg_msa',
+ 'mig_chg_reg', 'mig_move_reg', 'mig_same', 'mig_prev_sunbelt',
+ 'fam_under_18', 'country_father', 'country_mother', 'country_self',
+ 'citizenship', 'vet_question'
+ ]
+ train_raw_labels = train_df[label_columns]
+ other_raw_labels = other_df[label_columns]
+ transformed_train = pd.get_dummies(train_df, columns=categorical_columns)
+ transformed_other = pd.get_dummies(other_df, columns=categorical_columns)
+
+ # Filling the missing column in the other set
+ transformed_other[
+ 'det_hh_fam_stat_ Grandchild <18 ever marr not in subfamily'] = 0
+ # get label
+ transformed_train['income_50k'] = transformed_train['income_50k'].apply(
+ lambda x: fun1(x))
+ transformed_train['marital_stat'] = transformed_train[
+ 'marital_stat'].apply(lambda x: fun2(x))
+ transformed_other['income_50k'] = transformed_other['income_50k'].apply(
+ lambda x: fun1(x))
+ transformed_other['marital_stat'] = transformed_other[
+ 'marital_stat'].apply(lambda x: fun2(x))
+ # Split the other dataset into 1:1 validation to test according to the paper
+ validation_indices = transformed_other.sample(
+ frac=0.5, replace=False, random_state=1).index
+ test_indices = list(set(transformed_other.index) - set(validation_indices))
+ validation_data = transformed_other.iloc[validation_indices]
+ test_data = transformed_other.iloc[test_indices]
+
+ cols = transformed_train.columns.tolist()
+ cols.insert(0, cols.pop(cols.index('income_50k')))
+ cols.insert(0, cols.pop(cols.index('marital_stat')))
+ transformed_train = transformed_train[cols]
+ test_data = test_data[cols]
+ validation_data = validation_data[cols]
+
+ print(transformed_train.shape, transformed_other.shape,
+ validation_data.shape, test_data.shape)
+ transformed_train.to_csv(train_data_path + 'train_data.csv', index=False)
+ test_data.to_csv(test_data_path + 'test_data.csv', index=False)
+
+
+args = data_preparation_args()
+data_preparation(args.train_path, args.test_path, args.train_data_path,
+ args.test_data_path)
diff --git a/models/multitask/readme.md b/models/multitask/readme.md
index 7bf23ae3c626797db8ab7c13148b24a6904da355..bd36992c01c84bc14f2a7aaf6164718554f57b23 100755
--- a/models/multitask/readme.md
+++ b/models/multitask/readme.md
@@ -44,9 +44,12 @@
## 使用教程(快速开始)
```shell
-python -m paddlerec.run -m paddlerec.models.multitask.mmoe # mmoe
-python -m paddlerec.run -m paddlerec.models.multitask.share-bottom # share-bottom
-python -m paddlerec.run -m paddlerec.models.multitask.esmm # esmm
+git clone https://github.com/PaddlePaddle/PaddleRec.git paddle-rec
+cd paddle-rec
+
+python -m paddlerec.run -m models/multitask/mmoe/config.yaml # mmoe
+python -m paddlerec.run -m models/multitask/share-bottom/config.yaml # share-bottom
+python -m paddlerec.run -m models/multitask/esmm/config.yaml # esmm
```
## 使用教程(复现论文)
diff --git a/models/multitask/share-bottom/README.md b/models/multitask/share-bottom/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..1995e70f2189df7b0e098f29ddd5d9b82b46d053
--- /dev/null
+++ b/models/multitask/share-bottom/README.md
@@ -0,0 +1,151 @@
+# Share_bottom
+以下是本例的简要目录结构及说明:
+
+```
+├── data # 文档
+ ├── train #训练数据
+ ├── train_data.txt
+ ├── test #测试数据
+ ├── test_data.txt
+ ├── run.sh
+ ├── data_preparation.py
+├── __init__.py
+├── config.yaml #配置文件
+├── census_reader.py #数据读取文件
+├── model.py #模型文件
+
+```
+
+注:在阅读该示例前,建议您先了解以下内容:
+
+[paddlerec入门教程](https://github.com/PaddlePaddle/PaddleRec/blob/master/README.md)
+
+## 内容
+
+- [模型简介](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/share-bottom#模型简介)
+- [数据准备](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/share-bottom#数据准备)
+- [运行环境](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/share-bottom#运行环境)
+- [快速开始](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/share-bottom#快速开始)
+- [论文复现](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/share-bottom#论文复现)
+- [进阶使用](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/share-bottom#进阶使用)
+- [FAQ](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/share-bottom#FAQ)
+
+## 模型简介
+
+share_bottom是多任务学习的基本框架,其特点是对于不同的任务,底层的参数和网络结构是共享的,这种结构的优点是极大地减少网络的参数数量的情况下也能很好地对多任务进行学习,但缺点也很明显,由于底层的参数和网络结构是完全共享的,因此对于相关性不高的两个任务会导致优化冲突,从而影响模型最终的结果。后续很多Neural-based的多任务模型都是基于share_bottom发展而来的,如MMOE等模型可以改进share_bottom在多任务之间相关性低导致模型效果差的缺点。
+
+我们在Paddlepaddle实现share_bottom网络结构,并在开源数据集Census-income Data上验证模型效果。两个任务的auc分别为:
+
+1.income
+
+>max_sb_test_auc_income:0.94993
+>
+>mean_sb_test_auc_income: 0.93120
+
+2.marital
+
+> max_sb_test_auc_marital:0.99384
+>
+> mean_sb_test_auc_marital:0.99256
+
+本项目在paddlepaddle上实现share_bottom的网络结构,并在开源数据集 [Census-income Data](https://archive.ics.uci.edu/ml/datasets/Census-Income+(KDD) )上验证模型效果, 本模型配置默认使用demo数据集,若进行精度验证,请参考[论文复现](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multitask/share-bottom#论文复现)部分。
+
+本项目支持功能
+
+训练:单机CPU、单机单卡GPU、单机多卡GPU、本地模拟参数服务器训练、增量训练,配置请参考 [启动训练](https://github.com/PaddlePaddle/PaddleRec/blob/master/doc/train.md)
+
+预测:单机CPU、单机单卡GPU ;配置请参考[PaddleRec 离线预测](https://github.com/PaddlePaddle/PaddleRec/blob/master/doc/predict.md)
+
+## 数据准备
+
+数据地址: [Census-income Data](https://archive.ics.uci.edu/ml/datasets/Census-Income+(KDD) )
+
+数据解压后, 在create_data.sh脚本文件中添加文件的路径,并运行脚本。
+
+```sh
+mkdir train_data
+mkdir test_data
+mkdir data
+train_path="data/census-income.data"
+test_path="data/census-income.test"
+train_data_path="train_data/"
+test_data_path="test_data/"
+pip install -r requirements.txt
+wget -P data/ https://archive.ics.uci.edu/ml/machine-learning-databases/census-income-mld/census.tar.gz
+tar -zxvf data/census.tar.gz -C data/
+
+python data_preparation.py --train_path ${train_path} \
+ --test_path ${test_path} \
+ --train_data_path ${train_data_path}\
+ --test_data_path ${test_data_path}
+
+```
+
+生成的格式以逗号为分割点
+
+```
+0,0,73,0,0,0,0,1700.09,0,0
+```
+
+
+
+## 运行环境
+
+PaddlePaddle>=1.7.2
+
+python 2.7/3.5/3.6/3.7
+
+PaddleRec >=0.1
+
+os : windows/linux/macos
+
+## 快速开始
+
+### 单机训练
+
+CPU环境
+
+在config.yaml文件中设置好设备,epochs等。
+
+```sh
+dataset:
+- name: dataset_train
+ batch_size: 5
+ type: QueueDataset
+ data_path: "{workspace}/data/train"
+ data_converter: "{workspace}/census_reader.py"
+- name: dataset_infer
+ batch_size: 5
+ type: QueueDataset
+ data_path: "{workspace}/data/train"
+ data_converter: "{workspace}/census_reader.py"
+```
+
+### 单机预测
+
+CPU环境
+
+在config.yaml文件中设置好epochs、device等参数。
+
+```sh
+- name: infer_runner
+ class: infer
+ init_model_path: "increment/0"
+ device: cpu
+```
+
+## 论文复现
+
+用原论文的完整数据复现论文效果需要在config.yaml中修改batch_size=32, thread_num=8, epoch_num=100
+
+使用gpu p100 单卡训练 4.5h 100轮, 测试auc:best: 0.9939,mean:0.9931
+
+修改后运行方案:修改config.yaml中的'workspace'为config.yaml的目录位置,执行
+
+```text
+python -m paddlerec.run -m /home/your/dir/config.yaml #调试模式 直接指定本地config的绝对路径
+```
+
+## 进阶使用
+
+## FAQ
diff --git a/models/multitask/share-bottom/config.yaml b/models/multitask/share-bottom/config.yaml
index 9abb67dbe90fd4654ac949290960cf0cb0f02cf5..f4eccc8f37a54088d92c7a811795671434fc4170 100644
--- a/models/multitask/share-bottom/config.yaml
+++ b/models/multitask/share-bottom/config.yaml
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-workspace: "paddlerec.models.multitask.share-bottom"
+workspace: "models/multitask/share-bottom"
dataset:
- name: dataset_train
diff --git a/models/multitask/share-bottom/data/data_preparation.py b/models/multitask/share-bottom/data/data_preparation.py
new file mode 100644
index 0000000000000000000000000000000000000000..ad0775d1d12c6a0e9069f6e90a96ec6882084da2
--- /dev/null
+++ b/models/multitask/share-bottom/data/data_preparation.py
@@ -0,0 +1,118 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
+
+import pandas as pd
+import numpy as np
+import paddle.fluid as fluid
+from args import *
+
+
+def fun1(x):
+ if x == ' 50000+.':
+ return 1
+ else:
+ return 0
+
+
+def fun2(x):
+ if x == ' Never married':
+ return 1
+ else:
+ return 0
+
+
+def data_preparation(train_path, test_path, train_data_path, test_data_path):
+ # The column names are from
+ # https://www2.1010data.com/documentationcenter/prod/Tutorials/MachineLearningExamples/CensusIncomeDataSet.html
+ column_names = [
+ 'age', 'class_worker', 'det_ind_code', 'det_occ_code', 'education',
+ 'wage_per_hour', 'hs_college', 'marital_stat', 'major_ind_code',
+ 'major_occ_code', 'race', 'hisp_origin', 'sex', 'union_member',
+ 'unemp_reason', 'full_or_part_emp', 'capital_gains', 'capital_losses',
+ 'stock_dividends', 'tax_filer_stat', 'region_prev_res',
+ 'state_prev_res', 'det_hh_fam_stat', 'det_hh_summ', 'instance_weight',
+ 'mig_chg_msa', 'mig_chg_reg', 'mig_move_reg', 'mig_same',
+ 'mig_prev_sunbelt', 'num_emp', 'fam_under_18', 'country_father',
+ 'country_mother', 'country_self', 'citizenship', 'own_or_self',
+ 'vet_question', 'vet_benefits', 'weeks_worked', 'year', 'income_50k'
+ ]
+
+ # Load the dataset in Pandas
+ train_df = pd.read_csv(
+ train_path,
+ delimiter=',',
+ header=None,
+ index_col=None,
+ names=column_names)
+ other_df = pd.read_csv(
+ test_path,
+ delimiter=',',
+ header=None,
+ index_col=None,
+ names=column_names)
+
+ # First group of tasks according to the paper
+ label_columns = ['income_50k', 'marital_stat']
+
+ # One-hot encoding categorical columns
+ categorical_columns = [
+ 'class_worker', 'det_ind_code', 'det_occ_code', 'education',
+ 'hs_college', 'major_ind_code', 'major_occ_code', 'race',
+ 'hisp_origin', 'sex', 'union_member', 'unemp_reason',
+ 'full_or_part_emp', 'tax_filer_stat', 'region_prev_res',
+ 'state_prev_res', 'det_hh_fam_stat', 'det_hh_summ', 'mig_chg_msa',
+ 'mig_chg_reg', 'mig_move_reg', 'mig_same', 'mig_prev_sunbelt',
+ 'fam_under_18', 'country_father', 'country_mother', 'country_self',
+ 'citizenship', 'vet_question'
+ ]
+ train_raw_labels = train_df[label_columns]
+ other_raw_labels = other_df[label_columns]
+ transformed_train = pd.get_dummies(train_df, columns=categorical_columns)
+ transformed_other = pd.get_dummies(other_df, columns=categorical_columns)
+
+ # Filling the missing column in the other set
+ transformed_other[
+ 'det_hh_fam_stat_ Grandchild <18 ever marr not in subfamily'] = 0
+ # get label
+ transformed_train['income_50k'] = transformed_train['income_50k'].apply(
+ lambda x: fun1(x))
+ transformed_train['marital_stat'] = transformed_train[
+ 'marital_stat'].apply(lambda x: fun2(x))
+ transformed_other['income_50k'] = transformed_other['income_50k'].apply(
+ lambda x: fun1(x))
+ transformed_other['marital_stat'] = transformed_other[
+ 'marital_stat'].apply(lambda x: fun2(x))
+ # Split the other dataset into 1:1 validation to test according to the paper
+ validation_indices = transformed_other.sample(
+ frac=0.5, replace=False, random_state=1).index
+ test_indices = list(set(transformed_other.index) - set(validation_indices))
+ validation_data = transformed_other.iloc[validation_indices]
+ test_data = transformed_other.iloc[test_indices]
+
+ cols = transformed_train.columns.tolist()
+ cols.insert(0, cols.pop(cols.index('income_50k')))
+ cols.insert(0, cols.pop(cols.index('marital_stat')))
+ transformed_train = transformed_train[cols]
+ test_data = test_data[cols]
+ validation_data = validation_data[cols]
+
+ print(transformed_train.shape, transformed_other.shape,
+ validation_data.shape, test_data.shape)
+ transformed_train.to_csv(train_data_path + 'train_data.csv', index=False)
+ test_data.to_csv(test_data_path + 'test_data.csv', index=False)
+
+
+args = data_preparation_args()
+data_preparation(args.train_path, args.test_path, args.train_data_path,
+ args.test_data_path)
diff --git a/models/multitask/share-bottom/data/run.sh b/models/multitask/share-bottom/data/run.sh
new file mode 100644
index 0000000000000000000000000000000000000000..b60d42b37057593b1c16aa5fd91b8217a5a71bbf
--- /dev/null
+++ b/models/multitask/share-bottom/data/run.sh
@@ -0,0 +1,16 @@
+mkdir train_data
+mkdir test_data
+mkdir data
+train_path="data/census-income.data"
+test_path="data/census-income.test"
+train_data_path="train_data/"
+test_data_path="test_data/"
+pip install -r requirements.txt
+
+wget -P data/ https://archive.ics.uci.edu/ml/machine-learning-databases/census-income-mld/census.tar.gz
+tar -zxvf data/census.tar.gz -C data/
+
+python data_preparation.py --train_path ${train_path} \
+ --test_path ${test_path} \
+ --train_data_path ${train_data_path}\
+ --test_data_path ${test_data_path}
diff --git a/models/rank/AutoInt/config.yaml b/models/rank/AutoInt/config.yaml
index 942f98c81f0eefa30bf41991d83c2fe10f0dac91..15ddbc8b33bc5322250dfd335e96380a23bbbe45 100755
--- a/models/rank/AutoInt/config.yaml
+++ b/models/rank/AutoInt/config.yaml
@@ -14,7 +14,7 @@
# global settings
debug: false
-workspace: "paddlerec.models.rank.AutoInt"
+workspace: "models/rank/AutoInt"
dataset:
diff --git a/models/rank/BST/config.yaml b/models/rank/BST/config.yaml
index 73e39f19576f617dd83b813a7a12d626446c6f27..6fd12901d389a16d105386534e1c686a0617d2fd 100755
--- a/models/rank/BST/config.yaml
+++ b/models/rank/BST/config.yaml
@@ -14,7 +14,7 @@
# global settings
debug: false
-workspace: "paddlerec.models.rank.BST"
+workspace: "models/rank/BST"
dataset:
- name: sample_1
diff --git a/models/rank/afm/config.yaml b/models/rank/afm/config.yaml
index c55a96948d52388c94c6a614f448bda2c883f609..98372c1b5c5dde1ff3283b1886453682971089e5 100644
--- a/models/rank/afm/config.yaml
+++ b/models/rank/afm/config.yaml
@@ -15,7 +15,7 @@
# global settings
debug: false
-workspace: "paddlerec.models.rank.afm"
+workspace: "models/rank/afm"
dataset:
- name: train_sample
diff --git a/models/rank/dcn/config.yaml b/models/rank/dcn/config.yaml
index 2f8a1be4209cf4350c35d8e40d54e04ce0682ed4..d3185bbda8b3a5c87608afed4c9f6272e1f12634 100755
--- a/models/rank/dcn/config.yaml
+++ b/models/rank/dcn/config.yaml
@@ -15,7 +15,7 @@
# global settings
debug: false
-workspace: "paddlerec.models.rank.dcn"
+workspace: "models/rank/dcn"
dataset:
- name: train_sample
diff --git a/models/rank/deep_crossing/config.yaml b/models/rank/deep_crossing/config.yaml
index 54a4a895a1de8c63702df13b648577a0d2f17d7f..800a7debff61d2fa9a8aea1dfcac1f8254b74fd0 100755
--- a/models/rank/deep_crossing/config.yaml
+++ b/models/rank/deep_crossing/config.yaml
@@ -15,7 +15,7 @@
# global settings
debug: false
-workspace: "paddlerec.models.rank.deep_crossing"
+workspace: "models/rank/deep_crossing"
dataset:
- name: train_sample
diff --git a/models/rank/deepfm/config.yaml b/models/rank/deepfm/config.yaml
index 10c6fa35336ee333c47ceae0d3840f2c4dc89d14..0c1f9aa1f6678254ed3c1f4a5a5f7fa3cd8bfd15 100755
--- a/models/rank/deepfm/config.yaml
+++ b/models/rank/deepfm/config.yaml
@@ -14,7 +14,7 @@
# global settings
debug: false
-workspace: "paddlerec.models.rank.deepfm"
+workspace: "models/rank/deepfm"
dataset:
diff --git a/models/rank/dien/README.md b/models/rank/dien/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..2cea465e2120c14333d37f78e0660e48a1df3c05
--- /dev/null
+++ b/models/rank/dien/README.md
@@ -0,0 +1,5 @@
+
+# DIEN
+
+## 注意: config.yaml中指定了训练阶段的dataset名称为sample_1,预测阶段的dataset名称为infer_sample。同时在reader.py 和 infer_reader.py中,通个这两个dataset的名字读取的dataset的相关配置,如果修改了config.yaml中的dataset名字,需要在对应的reader.py 或者 infer_reader.py中同步修改下。
+
diff --git a/models/rank/dien/config.yaml b/models/rank/dien/config.yaml
index d47a76070c581b47509c8ecf16d7e631d4c59d08..44f4d28c49d7ed9a2c9877c7a5587a9947628bda 100755
--- a/models/rank/dien/config.yaml
+++ b/models/rank/dien/config.yaml
@@ -14,19 +14,19 @@
# global settings
debug: false
-workspace: "paddlerec.models.rank.dien"
+workspace: "models/rank/dien"
dataset:
- name: sample_1
type: DataLoader
- batch_size: 5
+ batch_size: 32
data_path: "{workspace}/data/train_data"
data_converter: "{workspace}/reader.py"
- name: infer_sample
type: DataLoader
- batch_size: 5
+ batch_size: 32
data_path: "{workspace}/data/train_data"
- data_converter: "{workspace}/reader.py"
+ data_converter: "{workspace}/infer_reader.py"
hyper_parameters:
optimizer:
diff --git a/models/rank/dien/infer_reader.py b/models/rank/dien/infer_reader.py
new file mode 100755
index 0000000000000000000000000000000000000000..8ac7a78e24665989e6b1ce66b6c07cd8c0264eaa
--- /dev/null
+++ b/models/rank/dien/infer_reader.py
@@ -0,0 +1,176 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
+from __future__ import print_function
+
+import os
+import random
+
+try:
+ import cPickle as pickle
+except ImportError:
+ import pickle
+
+import numpy as np
+
+from paddlerec.core.reader import ReaderBase
+from paddlerec.core.utils import envs
+
+
+class Reader(ReaderBase):
+ def init(self):
+ self.train_data_path = envs.get_global_env(
+ "dataset.infer_sample.data_path", None)
+ self.res = []
+ self.max_len = 0
+ self.neg_candidate_item = []
+ self.neg_candidate_cat = []
+ self.max_neg_item = 10000
+ self.max_neg_cat = 1000
+
+ data_file_list = os.listdir(self.train_data_path)
+ for i in range(0, len(data_file_list)):
+ train_data_file = os.path.join(self.train_data_path,
+ data_file_list[i])
+ with open(train_data_file, "r") as fin:
+ for line in fin:
+ line = line.strip().split(';')
+ hist = line[0].split()
+ self.max_len = max(self.max_len, len(hist))
+ fo = open("tmp.txt", "w")
+ fo.write(str(self.max_len))
+ fo.close()
+ self.batch_size = envs.get_global_env(
+ "dataset.infer_sample.batch_size", 32, None)
+ self.group_size = self.batch_size * 20
+
+ def _process_line(self, line):
+ line = line.strip().split(';')
+ hist = line[0].split()
+ hist = [int(i) for i in hist]
+ cate = line[1].split()
+ cate = [int(i) for i in cate]
+ return [hist, cate, [int(line[2])], [int(line[3])], [float(line[4])]]
+
+ def generate_sample(self, line):
+ """
+ Read the data line by line and process it as a dictionary
+ """
+
+ def data_iter():
+ # feat_idx, feat_value, label = self._process_line(line)
+ yield self._process_line(line)
+
+ return data_iter
+
+ def pad_batch_data(self, input, max_len):
+ res = np.array([x + [0] * (max_len - len(x)) for x in input])
+ res = res.astype("int64").reshape([-1, max_len])
+ return res
+
+ def make_data(self, b):
+ max_len = max(len(x[0]) for x in b)
+ # item = self.pad_batch_data([x[0] for x in b], max_len)
+ # cat = self.pad_batch_data([x[1] for x in b], max_len)
+ item = [x[0] for x in b]
+ cat = [x[1] for x in b]
+ neg_item = [None] * len(item)
+ neg_cat = [None] * len(cat)
+
+ for i in range(len(b)):
+ neg_item[i] = []
+ neg_cat[i] = []
+ if len(self.neg_candidate_item) < self.max_neg_item:
+ self.neg_candidate_item.extend(b[i][0])
+ if len(self.neg_candidate_item) > self.max_neg_item:
+ self.neg_candidate_item = self.neg_candidate_item[
+ 0:self.max_neg_item]
+ else:
+ len_seq = len(b[i][0])
+ start_idx = random.randint(0, self.max_neg_item - len_seq - 1)
+ self.neg_candidate_item[start_idx:start_idx + len_seq + 1] = b[
+ i][0]
+
+ if len(self.neg_candidate_cat) < self.max_neg_cat:
+ self.neg_candidate_cat.extend(b[i][1])
+ if len(self.neg_candidate_cat) > self.max_neg_cat:
+ self.neg_candidate_cat = self.neg_candidate_cat[
+ 0:self.max_neg_cat]
+ else:
+ len_seq = len(b[i][1])
+ start_idx = random.randint(0, self.max_neg_cat - len_seq - 1)
+ self.neg_candidate_item[start_idx:start_idx + len_seq + 1] = b[
+ i][1]
+ for _ in range(len(b[i][0])):
+ neg_item[i].append(self.neg_candidate_item[random.randint(
+ 0, len(self.neg_candidate_item) - 1)])
+ for _ in range(len(b[i][1])):
+ neg_cat[i].append(self.neg_candidate_cat[random.randint(
+ 0, len(self.neg_candidate_cat) - 1)])
+
+ len_array = [len(x[0]) for x in b]
+ mask = np.array(
+ [[0] * x + [-1e9] * (max_len - x) for x in len_array]).reshape(
+ [-1, max_len, 1])
+ target_item_seq = np.array(
+ [[x[2]] * max_len for x in b]).astype("int64").reshape(
+ [-1, max_len])
+ target_cat_seq = np.array(
+ [[x[3]] * max_len for x in b]).astype("int64").reshape(
+ [-1, max_len])
+ res = []
+ for i in range(len(b)):
+ res.append([
+ item[i], cat[i], b[i][2], b[i][3], b[i][4], mask[i],
+ target_item_seq[i], target_cat_seq[i], neg_item[i], neg_cat[i]
+ ])
+ return res
+
+ def batch_reader(self, reader, batch_size, group_size):
+ def batch_reader():
+ bg = []
+ for line in reader:
+ bg.append(line)
+ if len(bg) == group_size:
+ sortb = sorted(bg, key=lambda x: len(x[0]), reverse=False)
+ bg = []
+ for i in range(0, group_size, batch_size):
+ b = sortb[i:i + batch_size]
+ yield self.make_data(b)
+ len_bg = len(bg)
+ if len_bg != 0:
+ sortb = sorted(bg, key=lambda x: len(x[0]), reverse=False)
+ bg = []
+ remain = len_bg % batch_size
+ for i in range(0, len_bg - remain, batch_size):
+ b = sortb[i:i + batch_size]
+ yield self.make_data(b)
+
+ return batch_reader
+
+ def base_read(self, file_dir):
+ res = []
+ for train_file in file_dir:
+ with open(train_file, "r") as fin:
+ for line in fin:
+ line = line.strip().split(';')
+ hist = line[0].split()
+ cate = line[1].split()
+ res.append([hist, cate, line[2], line[3], float(line[4])])
+ return res
+
+ def generate_batch_from_trainfiles(self, files):
+ data_set = self.base_read(files)
+ random.shuffle(data_set)
+ return self.batch_reader(data_set, self.batch_size,
+ self.batch_size * 20)
diff --git a/models/rank/dien/reader.py b/models/rank/dien/reader.py
index fecc9c4c4948157341fa74c42469f26fddb2deae..6f6fdc10737c808beea0974e4bf83c6bb8770e5b 100755
--- a/models/rank/dien/reader.py
+++ b/models/rank/dien/reader.py
@@ -51,7 +51,7 @@ class Reader(ReaderBase):
fo.write(str(self.max_len))
fo.close()
self.batch_size = envs.get_global_env("dataset.sample_1.batch_size",
- 32, "train.reader")
+ 32, None)
self.group_size = self.batch_size * 20
def _process_line(self, line):
diff --git a/models/rank/din/README.md b/models/rank/din/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..702d24af8eaa12479057dfa7ccecc560c30e7ad0
--- /dev/null
+++ b/models/rank/din/README.md
@@ -0,0 +1,5 @@
+
+# DIN
+
+## 注意: config.yaml中指定了训练阶段的dataset名称为sample_1,预测阶段的dataset名称为infer_sample。同时在reader.py 和 infer_reader.py中,通个这两个dataset的名字读取的dataset的相关配置,如果修改了config.yaml中的dataset名字,需要在对应的reader.py 或者 infer_reader.py中同步修改下。
+
diff --git a/models/rank/din/config.yaml b/models/rank/din/config.yaml
index 95693c6de7e293f1f7f12e2d52684d8e1f59475b..832fa35efe9cc4208c8fc18536c976e4f8ab1541 100755
--- a/models/rank/din/config.yaml
+++ b/models/rank/din/config.yaml
@@ -14,7 +14,7 @@
# global settings
debug: false
-workspace: "paddlerec.models.rank.din"
+workspace: "models/rank/din"
dataset:
- name: sample_1
@@ -26,7 +26,7 @@ dataset:
type: DataLoader
batch_size: 5
data_path: "{workspace}/data/train_data"
- data_converter: "{workspace}/reader.py"
+ data_converter: "{workspace}/infer_reader.py"
hyper_parameters:
optimizer:
diff --git a/models/rank/din/infer_reader.py b/models/rank/din/infer_reader.py
new file mode 100755
index 0000000000000000000000000000000000000000..4cdd09e174d4873c04e88aec9e0411940ecbce59
--- /dev/null
+++ b/models/rank/din/infer_reader.py
@@ -0,0 +1,136 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
+from __future__ import print_function
+
+import os
+import random
+
+try:
+ import cPickle as pickle
+except ImportError:
+ import pickle
+
+import numpy as np
+
+from paddlerec.core.reader import ReaderBase
+from paddlerec.core.utils import envs
+
+
+class Reader(ReaderBase):
+ def init(self):
+ self.train_data_path = envs.get_global_env(
+ "dataset.infer_sample.data_path", None)
+ self.res = []
+ self.max_len = 0
+
+ data_file_list = os.listdir(self.train_data_path)
+ for i in range(0, len(data_file_list)):
+ train_data_file = os.path.join(self.train_data_path,
+ data_file_list[i])
+ with open(train_data_file, "r") as fin:
+ for line in fin:
+ line = line.strip().split(';')
+ hist = line[0].split()
+ self.max_len = max(self.max_len, len(hist))
+ fo = open("tmp.txt", "w")
+ fo.write(str(self.max_len))
+ fo.close()
+ self.batch_size = envs.get_global_env(
+ "dataset.infer_sample.batch_size", 32, None)
+ self.group_size = self.batch_size * 20
+
+ def _process_line(self, line):
+ line = line.strip().split(';')
+ hist = line[0].split()
+ hist = [int(i) for i in hist]
+ cate = line[1].split()
+ cate = [int(i) for i in cate]
+ return [hist, cate, [int(line[2])], [int(line[3])], [float(line[4])]]
+
+ def generate_sample(self, line):
+ """
+ Read the data line by line and process it as a dictionary
+ """
+
+ def data_iter():
+ # feat_idx, feat_value, label = self._process_line(line)
+ yield self._process_line(line)
+
+ return data_iter
+
+ def pad_batch_data(self, input, max_len):
+ res = np.array([x + [0] * (max_len - len(x)) for x in input])
+ res = res.astype("int64").reshape([-1, max_len])
+ return res
+
+ def make_data(self, b):
+ max_len = max(len(x[0]) for x in b)
+ item = self.pad_batch_data([x[0] for x in b], max_len)
+ cat = self.pad_batch_data([x[1] for x in b], max_len)
+ len_array = [len(x[0]) for x in b]
+ mask = np.array(
+ [[0] * x + [-1e9] * (max_len - x) for x in len_array]).reshape(
+ [-1, max_len, 1])
+ target_item_seq = np.array(
+ [[x[2]] * max_len for x in b]).astype("int64").reshape(
+ [-1, max_len])
+ target_cat_seq = np.array(
+ [[x[3]] * max_len for x in b]).astype("int64").reshape(
+ [-1, max_len])
+ res = []
+ for i in range(len(b)):
+ res.append([
+ item[i], cat[i], b[i][2], b[i][3], b[i][4], mask[i],
+ target_item_seq[i], target_cat_seq[i]
+ ])
+ return res
+
+ def batch_reader(self, reader, batch_size, group_size):
+ def batch_reader():
+ bg = []
+ for line in reader:
+ bg.append(line)
+ if len(bg) == group_size:
+ sortb = sorted(bg, key=lambda x: len(x[0]), reverse=False)
+ bg = []
+ for i in range(0, group_size, batch_size):
+ b = sortb[i:i + batch_size]
+ yield self.make_data(b)
+ len_bg = len(bg)
+ if len_bg != 0:
+ sortb = sorted(bg, key=lambda x: len(x[0]), reverse=False)
+ bg = []
+ remain = len_bg % batch_size
+ for i in range(0, len_bg - remain, batch_size):
+ b = sortb[i:i + batch_size]
+ yield self.make_data(b)
+
+ return batch_reader
+
+ def base_read(self, file_dir):
+ res = []
+ for train_file in file_dir:
+ with open(train_file, "r") as fin:
+ for line in fin:
+ line = line.strip().split(';')
+ hist = line[0].split()
+ cate = line[1].split()
+ res.append([hist, cate, line[2], line[3], float(line[4])])
+ return res
+
+ def generate_batch_from_trainfiles(self, files):
+ data_set = self.base_read(files)
+ random.shuffle(data_set)
+ return self.batch_reader(data_set, self.batch_size,
+ self.batch_size * 20)
diff --git a/models/rank/din/reader.py b/models/rank/din/reader.py
index 9c384f104c6f1ee5e2356a248b7d047c753f6959..d301b02fc53af1e51f21e7139f0549d5584afc15 100755
--- a/models/rank/din/reader.py
+++ b/models/rank/din/reader.py
@@ -47,7 +47,7 @@ class Reader(ReaderBase):
fo.write(str(self.max_len))
fo.close()
self.batch_size = envs.get_global_env("dataset.sample_1.batch_size",
- 32, "train.reader")
+ 32, None)
self.group_size = self.batch_size * 20
def _process_line(self, line):
diff --git a/models/rank/dnn/backend.yaml b/models/rank/dnn/backend.yaml
index 18647b37eef8e4eb33f788c0fb5a0292230bb4e2..03b5efe7847ddb4a6cabf0f817a58f686e12fad1 100644
--- a/models/rank/dnn/backend.yaml
+++ b/models/rank/dnn/backend.yaml
@@ -11,12 +11,8 @@
# 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.
-
-
-workspace: "./"
-
backend: "PaddleCloud"
-cluster_type: k8s # k8s 可选
+cluster_type: k8s # mpi 可选
config:
fs_name: "afs://xxx.com"
@@ -56,5 +52,12 @@ submit:
# for k8s gpu
k8s_trainers: 2
+ k8s_cpu_cores: 2
k8s_gpu_card: 1
+
+ # for k8s ps-cpu
+ k8s_trainers: 2
+ k8s_cpu_cores: 4
+ k8s_ps_num: 2
+ k8s_ps_cores: 4
diff --git a/models/rank/dnn/config.yaml b/models/rank/dnn/config.yaml
index 38166a55e3bf61ac91af372149be1a07a32ff43a..aa84a5070470cba750f7832644a9ce676c1d4ddd 100755
--- a/models/rank/dnn/config.yaml
+++ b/models/rank/dnn/config.yaml
@@ -13,7 +13,7 @@
# limitations under the License.
# workspace
-workspace: "paddlerec.models.rank.dnn"
+workspace: "models/rank/dnn"
# list of dataset
dataset:
@@ -67,7 +67,6 @@ runner:
save_inference_path: "inference" # save inference path
save_inference_feed_varnames: [] # feed vars of save inference
save_inference_fetch_varnames: [] # fetch vars of save inference
- init_model_path: "" # load model path
print_interval: 10
phases: [phase1]
diff --git a/models/rank/ffm/config.yaml b/models/rank/ffm/config.yaml
index 262407062f18aaf6544f00887cc8999ec35433ec..0ab323da4b7dcee344b7226fdb300a2e6df3a1ca 100644
--- a/models/rank/ffm/config.yaml
+++ b/models/rank/ffm/config.yaml
@@ -15,7 +15,7 @@
# global settings
debug: false
-workspace: "paddlerec.models.rank.ffm"
+workspace: "models/rank/ffm"
dataset:
- name: train_sample
diff --git a/models/rank/fgcnn/config.yaml b/models/rank/fgcnn/config.yaml
index c329c7eae0224583a42f5d1dbc454d5e712c1de0..3e220d18c8185ef792e30ded892a9c9ba8d8a783 100755
--- a/models/rank/fgcnn/config.yaml
+++ b/models/rank/fgcnn/config.yaml
@@ -15,7 +15,7 @@
# global settings
debug: false
-workspace: "paddlerec.models.rank.fgcnn"
+workspace: "models/rank/fgcnn"
dataset:
- name: train_sample
diff --git a/models/rank/fibinet/README.md b/models/rank/fibinet/README.md
index ea8c58d5b2eb6ef1208cf136d6ae516add42524f..573bb33b4b7db364e44e44fe7c600acca0a271cd 100644
--- a/models/rank/fibinet/README.md
+++ b/models/rank/fibinet/README.md
@@ -16,13 +16,35 @@
├── config.yaml #配置文件
```
-## 简介
+注:在阅读该示例前,建议您先了解以下内容:
+
+[paddlerec入门教程](https://github.com/PaddlePaddle/PaddleRec/blob/master/README.md)
+
+
+---
+## 内容
+
+- [模型简介](#模型简介)
+- [数据准备](#数据准备)
+- [运行环境](#运行环境)
+- [快速开始](#快速开始)
+- [论文复现](#论文复现)
+- [进阶使用](#进阶使用)
+- [FAQ](#FAQ)
+
+## 模型简介
[《FiBiNET: Combining Feature Importance and Bilinear feature Interaction for Click-Through Rate Prediction》]( https://arxiv.org/pdf/1905.09433.pdf)是新浪微博机器学习团队发表在RecSys19上的一篇论文,文章指出当前的许多通过特征组合进行CTR预估的工作主要使用特征向量的内积或哈达玛积来计算交叉特征,这种方法忽略了特征本身的重要程度。提出通过使用Squeeze-Excitation network (SENET) 结构动态学习特征的重要性以及使用一个双线性函数来更好的建模交叉特征。
-本项目在paddlepaddle上实现FibiNET的网络结构,并在开源数据集Criteo上验证模型效果。
+本项目在paddlepaddle上实现FibiNET的网络结构,并在开源数据集Criteo上验证模型效果, 本模型配置默认使用demo数据集,若进行精度验证,请参考[论文复现](#论文复现)部分。
+
+本项目支持功能
+
+训练:单机CPU、单机单卡GPU、单机多卡GPU、本地模拟参数服务器训练、增量训练,配置请参考 [启动训练](https://github.com/PaddlePaddle/PaddleRec/blob/master/doc/train.md)
+
+预测:单机CPU、单机单卡GPU ;配置请参考[PaddleRec 离线预测](https://github.com/PaddlePaddle/PaddleRec/blob/master/doc/predict.md)
-## 数据下载及预处理
+## 数据准备
数据地址:[Criteo]( https://fleet.bj.bcebos.com/ctr_data.tar.gz)
@@ -36,15 +58,33 @@
sh run.sh
```
-## 环境
+原始的数据格式为13个dense部分特征+离散化特征,用'\t'切分, 对应的数据是data/train_data_full data/test_data_full
+```
+0 1 1 5 0 1382 4 15 2 181 1 2 2 68fd1e64 80e26c9b fb936136 7b4723c4 25c83c98 7e0ccccf de7995b8 1f89b562 a73ee510 a8cd5504 b2cb9c98 37c9c164 2824a5f6 1adce6ef 8ba8b39a 891b62e7 e5ba7672 f54016b9 21ddcdc9 b1252a9d 07b5194c 3a171ecb c5c50484 e8b83407 9727dd16
+```
+
+经过get_slot_data.py处理后,得到如下数据, dense_feature中的值会merge在一起,对应net.py中的self._dense_data_var, '1:715353'表示net.py中的self._sparse_data_var[1] = 715353, 对应的数据是data/slot_train_data_full, data/slot_test_data_full
+```
+click:0 dense_feature:0.05 dense_feature:0.00663349917081 dense_feature:0.05 dense_feature:0.0 dense_feature:0.02159375 dense_feature:0.008 dense_feature:0.15 dense_feature:0.04 dense_feature:0.362 dense_feature:0.1 dense_feature:0.2 dense_feature:0.0 dense_feature:0.04 1:715353 2:817085 3:851010 4:833725 5:286835 6:948614 7:881652 8:507110 9:27346 10:646986 11:643076 12:200960 13:18464 14:202774 15:532679 16:729573 17:342789 18:562805 19:880474 20:984402 21:666449 22:26235 23:700326 24:452909 25:884722 26:787527
+```
+
+
-PaddlePaddle 1.7.2
+## 运行环境
-python3.7
+PaddlePaddle>=1.7.2
-PaddleRec
+python 2.7/3.5/3.6/3.7
-## 单机训练
+PaddleRec >=0.1
+
+os : windows/linux/macos
+
+
+
+## 快速开始
+
+### 单机训练
CPU环境
@@ -73,7 +113,7 @@ runner:
phases: [phase1]
```
-## 单机预测
+### 单机预测
CPU环境
@@ -90,17 +130,15 @@ CPU环境
phases: [phase2]
```
-## 运行
-
+### 运行
```
-python -m paddlerec.run -m paddlerec.models.rank.fibinet
+python -m paddlerec.run -m models/rank/fibinet
```
-## 模型效果
-在样例数据上测试模型
+### 结果展示
-训练:
+样例数据训练结果展示:
```
Running SingleStartup.
@@ -122,7 +160,7 @@ batch: 1800, AUC: [0.85260467], BATCH_AUC: [0.92847032]
epoch 3 done, use time: 1618.1106688976288
```
-预测
+样例数据预测结果展示
```
load persistables from increment_model/3
@@ -136,3 +174,18 @@ batch: 1800, AUC: [0.86633785], BATCH_AUC: [0.96900967]
batch: 1820, AUC: [0.86662365], BATCH_AUC: [0.96759972]
```
+## 论文复现
+
+用原论文的完整数据复现论文效果需要在config.yaml中修改batch_size=1000, thread_num=8, epoch_num=4
+
+使用gpu p100 单卡训练 60h 测试auc:0.79
+
+
+修改后运行方案:修改config.yaml中的'workspace'为config.yaml的目录位置,执行
+```
+python -m paddlerec.run -m /home/your/dir/config.yaml #调试模式 直接指定本地config的绝对路径
+```
+
+## 进阶使用
+
+## FAQ
diff --git a/models/rank/fibinet/config.yaml b/models/rank/fibinet/config.yaml
index 091915e6a41ec56824557426553c0d062d26127f..4f0951682e4e96c2fb7c4c373a56de4e6d6bc951 100644
--- a/models/rank/fibinet/config.yaml
+++ b/models/rank/fibinet/config.yaml
@@ -13,7 +13,7 @@
# limitations under the License.
# workspace
-workspace: "paddlerec.models.rank.fibinet"
+workspace: "models/rank/fibinet"
# list of dataset
dataset:
diff --git a/models/rank/flen/README.md b/models/rank/flen/README.md
index 9dafeac6958ffb4f51c8f54527976fc4d431bf71..845d15899eb26f3b4d3ad223dcfd4931dfc43c9f 100644
--- a/models/rank/flen/README.md
+++ b/models/rank/flen/README.md
@@ -15,23 +15,53 @@
├── config.yaml #配置文件
```
-## 简介
+注:在阅读该示例前,建议您先了解以下内容:
+
+[paddlerec入门教程](https://github.com/PaddlePaddle/PaddleRec/blob/master/README.md)
+
+
+---
+## 内容
+
+- [模型简介](#模型简介)
+- [数据准备](#数据准备)
+- [运行环境](#运行环境)
+- [快速开始](#快速开始)
+- [论文复现](#论文复现)
+- [进阶使用](#进阶使用)
+- [FAQ](#FAQ)
+
+## 模型简介
[《FLEN: Leveraging Field for Scalable CTR Prediction》](https://arxiv.org/pdf/1911.04690.pdf)文章提出了field-wise bi-interaction pooling技术,解决了在大规模应用特征field信息时存在的时间复杂度和空间复杂度高的困境,同时提出了一种缓解梯度耦合问题的方法dicefactor。该模型已应用于美图的大规模推荐系统中,持续稳定地取得业务效果的全面提升。
-本项目在avazu数据集上验证模型效果
+本项目在avazu数据集上验证模型效果, 本模型配置默认使用demo数据集,若进行精度验证,请参考[论文复现](#论文复现)部分。
+
+本项目支持功能
+
+训练:单机CPU、单机单卡GPU、单机多卡GPU、本地模拟参数服务器训练、增量训练,配置请参考 [启动训练](https://github.com/PaddlePaddle/PaddleRec/blob/master/doc/train.md)
+
+预测:单机CPU、单机单卡GPU ;配置请参考[PaddleRec 离线预测](https://github.com/PaddlePaddle/PaddleRec/blob/master/doc/predict.md)
+
+## 数据准备
+
-## 数据下载及预处理
-## 环境
-PaddlePaddle 1.7.2
+## 运行环境
-python3.7
+PaddlePaddle>=1.7.2
-PaddleRec
+python 2.7/3.5/3.6/3.7
-## 单机训练
+PaddleRec >=0.1
+
+os : windows/linux/macos
+
+
+
+## 快速开始
+### 单机训练
CPU环境
@@ -60,7 +90,7 @@ runner:
phases: [phase1]
```
-## 单机预测
+### 单机预测
CPU环境
@@ -77,54 +107,21 @@ CPU环境
phases: [phase2]
```
-## 运行
+### 运行
```
-python -m paddlerec.run -m paddlerec.models.rank.flen
+python -m paddlerec.run -m models/rank/flen
```
-## 模型效果
+## 论文复现
-在样例数据上测试模型
+用原论文的完整数据复现论文效果需要在config.yaml中修改batch_size=512, thread_num=8, epoch_num=1
-训练:
+全量数据的效果未来补充。
-```
-0702 13:38:20.903220 7368 parallel_executor.cc:440] The Program will be executed on CPU using ParallelExecutor, 2 cards are used, so 2 programs are executed in parallel.
-I0702 13:38:20.925912 7368 parallel_executor.cc:307] Inplace strategy is enabled, when build_strategy.enable_inplace = True
-I0702 13:38:20.933356 7368 parallel_executor.cc:375] Garbage collection strategy is enabled, when FLAGS_eager_delete_tensor_gb = 0
-batch: 2, AUC: [0.09090909 0. ], BATCH_AUC: [0.09090909 0. ]
-batch: 4, AUC: [0.31578947 0.29411765], BATCH_AUC: [0.31578947 0.29411765]
-batch: 6, AUC: [0.41333333 0.33333333], BATCH_AUC: [0.41333333 0.33333333]
-batch: 8, AUC: [0.4453125 0.44166667], BATCH_AUC: [0.4453125 0.44166667]
-batch: 10, AUC: [0.39473684 0.38888889], BATCH_AUC: [0.44117647 0.41176471]
-batch: 12, AUC: [0.41860465 0.45535714], BATCH_AUC: [0.5078125 0.54545455]
-batch: 14, AUC: [0.43413729 0.42746615], BATCH_AUC: [0.56666667 0.56 ]
-batch: 16, AUC: [0.46433566 0.47460087], BATCH_AUC: [0.53 0.59247649]
-batch: 18, AUC: [0.44009217 0.44642857], BATCH_AUC: [0.46 0.47]
-batch: 20, AUC: [0.42705314 0.43781095], BATCH_AUC: [0.45878136 0.4874552 ]
-batch: 22, AUC: [0.45176471 0.46011281], BATCH_AUC: [0.48046875 0.45878136]
-batch: 24, AUC: [0.48375 0.48910256], BATCH_AUC: [0.56630824 0.59856631]
-epoch 0 done, use time: 0.21532440185546875
-PaddleRec Finish
-```
-预测
-```
-PaddleRec: Runner single_cpu_infer Begin
-Executor Mode: infer
-processor_register begin
-Running SingleInstance.
-Running SingleNetwork.
-QueueDataset can not support PY3, change to DataLoader
-QueueDataset can not support PY3, change to DataLoader
-Running SingleInferStartup.
-Running SingleInferRunner.
-load persistables from increment_model/0
-batch: 20, AUC: [0.49121353], BATCH_AUC: [0.66176471]
-batch: 40, AUC: [0.51156463], BATCH_AUC: [0.55197133]
-Infer phase2 of 0 done, use time: 0.3941819667816162
-PaddleRec Finish
-```
+## 进阶使用
+
+## FAQ
diff --git a/models/rank/flen/config.yaml b/models/rank/flen/config.yaml
index a2dad399fd98a2a888fb2d3efbfa40f52f273de2..49555bcb9e97299a4f7658c8a2f79c53219f93e6 100644
--- a/models/rank/flen/config.yaml
+++ b/models/rank/flen/config.yaml
@@ -13,7 +13,7 @@
# limitations under the License.
# workspace
-workspace: "paddlerec.models.rank.flen"
+workspace: "models/rank/flen"
# list of dataset
dataset:
diff --git a/models/rank/flen/data/get_data.py b/models/rank/flen/data/get_data.py
new file mode 100644
index 0000000000000000000000000000000000000000..27a2653673d252b8cb13404b4f65f79c23a8c29f
--- /dev/null
+++ b/models/rank/flen/data/get_data.py
@@ -0,0 +1,70 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
+
+import numpy as np
+import pandas as pd
+from sklearn.preprocessing import LabelEncoder
+
+data = pd.read_csv('./avazu_sample.txt')
+data['day'] = data['hour'].apply(lambda x: str(x)[4:6])
+data['hour'] = data['hour'].apply(lambda x: str(x)[6:])
+
+sparse_features = [
+ 'hour',
+ 'C1',
+ 'banner_pos',
+ 'site_id',
+ 'site_domain',
+ 'site_category',
+ 'app_id',
+ 'app_domain',
+ 'app_category',
+ 'device_id',
+ 'device_model',
+ 'device_type',
+ 'device_conn_type', # 'device_ip',
+ 'C14',
+ 'C15',
+ 'C16',
+ 'C17',
+ 'C18',
+ 'C19',
+ 'C20',
+ 'C21',
+]
+
+data[sparse_features] = data[sparse_features].fillna('-1', )
+
+# 1.Label Encoding for sparse features,and do simple Transformation for dense features
+for feat in sparse_features:
+ lbe = LabelEncoder()
+ data[feat] = lbe.fit_transform(data[feat])
+
+cols = [
+ 'click', 'C14', 'C15', 'C16', 'C17', 'C18', 'C19', 'C20', 'C21', 'C1',
+ 'device_model', 'device_type', 'device_id', 'app_id', 'app_domain',
+ 'app_category', 'banner_pos', 'site_id', 'site_domain', 'site_category',
+ 'device_conn_type', 'hour'
+]
+# 计算每一个特征的最大值,作为vacob_size
+data = data[cols]
+line = ''
+vacob_file = open('vacob_file.txt', 'w')
+for col in cols[1:]:
+ max_val = data[col].max()
+ line += str(max_val) + ','
+vacob_file.write(line)
+vacob_file.close()
+
+data.to_csv('./train_data/train_data.txt', index=False, header=None)
diff --git a/models/rank/fm/config.yaml b/models/rank/fm/config.yaml
index e9f30573177708c470162b8f8c2a35a656a4e5c2..12605004785728e2a6311de138c2fb5e5ad0cd7a 100644
--- a/models/rank/fm/config.yaml
+++ b/models/rank/fm/config.yaml
@@ -15,7 +15,7 @@
# global settings
debug: false
-workspace: "paddlerec.models.rank.fm"
+workspace: "models/rank/fm"
dataset:
- name: train_sample
diff --git a/models/rank/fnn/config.yaml b/models/rank/fnn/config.yaml
index 6f3995d8c0eb7f1dc98834719055015f5ac6fecd..877ea9d919a2140700059436a1b5d3748a4ff8c2 100755
--- a/models/rank/fnn/config.yaml
+++ b/models/rank/fnn/config.yaml
@@ -15,7 +15,7 @@
# global settings
debug: false
-workspace: "paddlerec.models.rank.fnn"
+workspace: "models/rank/fnn"
dataset:
- name: train_sample
diff --git a/models/rank/logistic_regression/config.yaml b/models/rank/logistic_regression/config.yaml
index 8e88ee1b68b7110dad731365b9324dc31caad1aa..7052ba27ae09b867535e1adae0db26b89dd97d9d 100644
--- a/models/rank/logistic_regression/config.yaml
+++ b/models/rank/logistic_regression/config.yaml
@@ -14,7 +14,7 @@
# global settings
debug: false
-workspace: "paddlerec.models.rank.logistic_regression"
+workspace: "models/rank/logistic_regression"
dataset:
diff --git a/models/rank/nfm/config.yaml b/models/rank/nfm/config.yaml
index 266cdfbeb6fd2a82c18409e004c93b1cfbfcb0ea..c4c73d241dc5fc02f691fcb87c6e60f5edbdd4f9 100644
--- a/models/rank/nfm/config.yaml
+++ b/models/rank/nfm/config.yaml
@@ -15,7 +15,7 @@
# global settings
debug: false
-workspace: "paddlerec.models.rank.nfm"
+workspace: "models/rank/nfm"
dataset:
- name: train_sample
diff --git a/models/rank/pnn/config.yaml b/models/rank/pnn/config.yaml
index 4624d9388677b4c83fe133ebfc5b4b595fc915e9..e4177e3cb18a92e34a1295388b54c9cb284e8321 100644
--- a/models/rank/pnn/config.yaml
+++ b/models/rank/pnn/config.yaml
@@ -15,7 +15,7 @@
# global settings
debug: false
-workspace: "paddlerec.models.rank.pnn"
+workspace: "models/rank/pnn"
dataset:
- name: train_sample
diff --git a/models/rank/readme.md b/models/rank/readme.md
index cb34dcd6ffca7a3a52fa805a64dd3ab651016e99..dc32b7d0231a28c89973280d781e73ce3633a7a0 100644
--- a/models/rank/readme.md
+++ b/models/rank/readme.md
@@ -107,7 +107,7 @@ sh run.sh
### 训练
```
cd modles/rank/dnn # 进入选定好的排序模型的目录 以DNN为例
-python -m paddlerec.run -m paddlerec.models.rank.dnn # 使用内置配置
+python -m paddlerec.run -m models/rank/dnn/config.yaml # 使用内置配置
# 如果需要使用自定义配置,config.yaml中workspace需要使用改模型目录的绝对路径
# 自定义修改超参后,指定配置文件,使用自定义配置
python -m paddlerec.run -m ./config.yaml
diff --git a/models/rank/wide_deep/README.md b/models/rank/wide_deep/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..c32047c0af2ed0198a1e11e321304cbeb67f7f66
--- /dev/null
+++ b/models/rank/wide_deep/README.md
@@ -0,0 +1,127 @@
+# wide&deep
+
+以下是本例的简要目录结构及说明:
+
+```
+├── data # 文档
+ ├── train #训练数据
+ ├── train_data.txt
+ ├── create_data.sh
+ ├── data_preparation.py
+ ├── get_slot_data.py
+ ├── run.sh
+├── __init__.py
+├── config.yaml #配置文件
+├── model.py #模型文件
+```
+
+注:在阅读该示例前,建议您先了解以下内容:
+
+[paddlerec入门教程](https://github.com/PaddlePaddle/PaddleRec/blob/master/README.md)
+
+## 内容
+
+- [模型简介](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/rank/wide_deep#模型简介)
+- [数据准备](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/rank/wide_deep#数据准备)
+- [运行环境](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/rank/wide_deep#运行环境)
+- [快速开始](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/rank/wide_deep#快速开始)
+- [论文复现](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/rank/wide_deep#论文复现)
+- [进阶使用](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/rank/wide_deep#进阶使用)
+- [FAQ](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/rank/wide_deep#FAQ)
+
+## 模型简介
+
+[《Wide & Deep Learning for Recommender Systems》]( https://arxiv.org/pdf/1606.07792.pdf)是Google 2016年发布的推荐框架,wide&deep设计了一种融合浅层(wide)模型和深层(deep)模型进行联合训练的框架,综合利用浅层模型的记忆能力和深层模型的泛化能力,实现单模型对推荐系统准确性和扩展性的兼顾。从推荐效果和服务性能两方面进行评价:
+
+1. 效果上,在Google Play 进行线上A/B实验,wide&deep模型相比高度优化的Wide浅层模型,app下载率+3.9%。相比deep模型也有一定提升。
+2. 性能上,通过切分一次请求需要处理的app 的Batch size为更小的size,并利用多线程并行请求达到提高处理效率的目的。单次响应耗时从31ms下降到14ms。
+
+本例在paddlepaddle上实现wide&deep并在开源数据集Census-income Data上验证模型效果,在测试集上的平均acc和auc分别为:
+
+> mean_acc: 0.76195
+>
+> mean_auc: 0.90577
+
+若进行精度验证,请参考[论文复现](https://github.com/PaddlePaddle/PaddleRec/tree/master/models/rank/wide_deep#论文复现)部分。
+
+本项目支持功能
+
+训练:单机CPU、单机单卡GPU、单机多卡GPU、本地模拟参数服务器训练、增量训练,配置请参考 [启动训练](https://github.com/PaddlePaddle/PaddleRec/blob/master/doc/train.md)
+
+预测:单机CPU、单机单卡GPU ;配置请参考[PaddleRec 离线预测](https://github.com/PaddlePaddle/PaddleRec/blob/master/doc/predict.md)
+
+## 数据准备
+
+数据地址:
+
+[adult.data](https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data)
+
+[adult.test](https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test)
+
+## 运行环境
+
+PaddlePaddle>=1.7.2
+
+python 2.7/3.5/3.6/3.7
+
+PaddleRec >=0.1
+
+os : windows/linux/macos
+
+## 快速开始
+
+### 单机训练
+
+CPU环境
+
+在config.yaml文件中设置好设备,epochs等。
+
+```sh
+dataset:
+ - name: sample_1
+ type: QueueDataset
+ batch_size: 5
+ data_path: "{workspace}/data/sample_data/train"
+ sparse_slots: "label"
+ dense_slots: "wide_input:8 deep_input:58"
+ - name: infer_sample
+ type: QueueDataset
+ batch_size: 5
+ data_path: "{workspace}/data/sample_data/train"
+ sparse_slots: "label"
+ dense_slots: "wide_input:8 deep_input:58"
+```
+
+### 单机预测
+
+CPU环境
+
+在config.yaml文件中设置好epochs、device等参数。
+
+```
+ - name: infer_runner
+ class: infer
+ device: cpu
+ init_model_path: "increment/0"
+```
+
+
+## 论文复现
+
+
+用原论文的完整数据复现论文效果需要在config.yaml中修改batch_size=40, thread_num=8, epoch_num=40
+
+本例在paddlepaddle上实现wide&deep并在开源数据集Census-income Data上验证模型效果,在测试集上的平均acc和auc分别为:
+
+mean_acc: 0.76195 , mean_auc: 0.90577
+
+
+修改后运行方案:修改config.yaml中的'workspace'为config.yaml的目录位置,执行
+
+```
+python -m paddlerec.run -m /home/your/dir/config.yaml #调试模式 直接指定本地config的绝对路径
+```
+
+## 进阶使用
+
+## FAQ
diff --git a/models/rank/wide_deep/config.yaml b/models/rank/wide_deep/config.yaml
index 1ff5232e727b9f4af28639be15c36611c29b4ee7..d1da03e7e8ac371c88506604f5b4a0d649b92746 100755
--- a/models/rank/wide_deep/config.yaml
+++ b/models/rank/wide_deep/config.yaml
@@ -14,7 +14,7 @@
# global settings
debug: false
-workspace: "paddlerec.models.rank.wide_deep"
+workspace: "models/rank/wide_deep"
dataset:
diff --git a/models/rank/xdeepfm/config.yaml b/models/rank/xdeepfm/config.yaml
index 716513d405431dcf2ad55011d8e0a68b8daecc43..a767da97f646e1210948d74c90a981996f7b35a8 100755
--- a/models/rank/xdeepfm/config.yaml
+++ b/models/rank/xdeepfm/config.yaml
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
debug: false
-workspace: "paddlerec.models.rank.xdeepfm"
+workspace: "models/rank/xdeepfm"
dataset:
- name: sample_1
diff --git a/models/recall/fasttext/config.yaml b/models/recall/fasttext/config.yaml
index c9725ab8b2bb6c5a7f107acbc04a1f034322e166..5e02b9983518fcf4e813909cc794de37c0800a21 100644
--- a/models/recall/fasttext/config.yaml
+++ b/models/recall/fasttext/config.yaml
@@ -11,7 +11,7 @@
# 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.
-workspace: "paddlerec.models.recall.fasttext"
+workspace: "models/recall/fasttext"
# list of dataset
dataset:
diff --git a/models/recall/gnn/config.yaml b/models/recall/gnn/config.yaml
index b488fc656afb4eb548b4da7b013cd0b44a4eab04..48a1f2833e09dcc36c11533431929787bef75ff6 100755
--- a/models/recall/gnn/config.yaml
+++ b/models/recall/gnn/config.yaml
@@ -13,7 +13,7 @@
# limitations under the License.
# workspace
-workspace: "paddlerec.models.recall.gnn"
+workspace: "models/recall/gnn"
# list of dataset
dataset:
@@ -42,11 +42,11 @@ hyper_parameters:
gnn_propogation_steps: 1
# select runner by name
-mode: train_runner
+mode: [single_cpu_train, single_cpu_infer]
# config of each runner.
# runner is a kind of paddle training class, which wraps the train/infer process.
runner:
-- name: train_runner
+- name: single_cpu_train
class: train
# num of epochs
epochs: 5
@@ -59,21 +59,23 @@ runner:
save_inference_feed_varnames: [] # feed vars of save inference
save_inference_fetch_varnames: [] # fetch vars of save inference
init_model_path: "" # load model path
- print_interval: 10
-- name: infer_runner
+ print_interval: 1
+ phases: [phase1]
+- name: single_cpu_infer
class: infer
# device to run training or infer
device: cpu
print_interval: 1
init_model_path: "increment_gnn" # load model path
+ phases: [phase2]
# runner will run all the phase in each epoch
phase:
-- name: phase_train
+- name: phase1
model: "{workspace}/model.py" # user-defined model
dataset_name: dataset_train # select dataset by name
thread_num: 1
-# - name: phase_infer
-# model: "{workspace}/model.py" # user-defined model
-# dataset_name: dataset_infer # select dataset by name
-# thread_num: 1
+- name: phase2
+ model: "{workspace}/model.py" # user-defined model
+ dataset_name: dataset_infer # select dataset by name
+ thread_num: 1
diff --git a/models/recall/gnn/model.py b/models/recall/gnn/model.py
index 21b884215f80180cea5f3daf6fbf53a4187b1600..0fea889e4ace4d0b2dff3058ac5b7f75a6c867ae 100755
--- a/models/recall/gnn/model.py
+++ b/models/recall/gnn/model.py
@@ -20,7 +20,7 @@ import paddle.fluid.layers as layers
from paddlerec.core.utils import envs
from paddlerec.core.model import ModelBase
-from paddlerec.core.metrics import Precision
+from paddlerec.core.metrics import RecallK
class Model(ModelBase):
@@ -236,7 +236,7 @@ class Model(ModelBase):
softmax = layers.softmax_with_cross_entropy(
logits=logits, label=inputs[6]) # [batch_size, 1]
self.loss = layers.reduce_mean(softmax) # [1]
- acc = Precision(input=logits, label=inputs[6], k=20)
+ acc = RecallK(input=logits, label=inputs[6], k=20)
self._cost = self.loss
if is_infer:
diff --git a/models/recall/gnn/readme.md b/models/recall/gnn/readme.md
index 3361f14b59a1dd118ebb147e0a5cb8d1b585ec77..8cd4799e421d47c85238fad7883bb16ac4064746 100644
--- a/models/recall/gnn/readme.md
+++ b/models/recall/gnn/readme.md
@@ -1,13 +1,69 @@
# GNN
-## 快速开始
-PaddleRec中每个内置模型都配备了对应的样例数据,用户可基于该数据集快速对模型、环境进行验证,从而降低后续的调试成本。在内置数据集上进行训练的命令为:
+以下是本例的简要目录结构及说明:
+
```
-python -m paddlerec.run -m paddlerec.models.recall.gnn
+├── data #样例数据
+ ├── train
+ ├── train.txt
+ ├── test
+ ├── test.txt
+ ├── download.py
+ ├── convert_data.py
+ ├── preprocess.py
+├── __init__.py
+├── README.md # 文档
+├── model.py #模型文件
+├── config.yaml #配置文件
+├── data_prepare.sh #一键数据处理脚本
+├── reader.py #训练数据reader
+├── evaluate_reader.py # 预测数据reader
```
+注:在阅读该示例前,建议您先了解以下内容:
+
+[paddlerec入门教程](https://github.com/PaddlePaddle/PaddleRec/blob/master/README.md)
+
+
+---
+## 内容
+
+- [模型简介](#模型简介)
+- [数据准备](#数据准备)
+- [运行环境](#运行环境)
+- [快速开始](#快速开始)
+- [论文复现](#论文复现)
+- [进阶使用](#进阶使用)
+- [FAQ](#FAQ)
+
+## 模型简介
+SR-GNN模型的介绍可以参阅论文[Session-based Recommendation with Graph Neural Networks](https://arxiv.org/abs/1811.00855)。
+
+本文解决的是Session-based Recommendation这一问题,过程大致分为以下四步:
+
+1. 首先对所有的session序列通过有向图进行建模。
+
+2. 然后通过GNN,学习每个node(item)的隐向量表示
+
+3. 通过一个attention架构模型得到每个session的embedding
+
+4. 最后通过一个softmax层进行全表预测
+
+本示例中,我们复现了论文效果,在DIGINETICA数据集上P@20可以达到50.7。
+
+同时推荐用户参考[ IPython Notebook demo](https://aistudio.baidu.com/aistudio/projectDetail/124382)
+
+本模型配置默认使用demo数据集,若进行精度验证,请参考[论文复现](#论文复现)部分。
+
+本项目支持功能
+
+训练:单机CPU、单机单卡GPU、单机多卡GPU、本地模拟参数服务器训练、增量训练,配置请参考 [启动训练](https://github.com/PaddlePaddle/PaddleRec/blob/master/doc/train.md)
+
+预测:单机CPU、单机单卡GPU ;配置请参考[PaddleRec 离线预测](https://github.com/PaddlePaddle/PaddleRec/blob/master/doc/predict.md)
+
## 数据处理
-- Step1: 原始数据数据集下载,本示例提供了两个开源数据集:DIGINETICA和Yoochoose,可选其中任意一个训练本模型。
+本示例中数据处理共包含三步:
+- Step1: 原始数据数据集下载,本示例提供了两个开源数据集:DIGINETICA和Yoochoose,可选其中任意一个训练本模型。数据下载命令及原始数据格式如下所示。若采用diginetica数据集,执行完该命令之后,会在data目录下得到原始数据文件train-item-views.csv。若采用yoochoose数据集,执行完该命令之后,会在data目录下得到原始数据文件yoochoose-clicks.dat。
```
cd data && python download.py diginetica # or yoochoose
```
@@ -24,14 +80,13 @@ python -m paddlerec.run -m paddlerec.models.recall.gnn
4. timeframe - time since the first query in a session, in milliseconds.
5. eventdate - calendar date.
-- Step2: 数据预处理
+- Step2: 数据预处理。
+ 1. 以session_id为key合并原始数据集,得到每个session的日期,及顺序点击列表。
+ 2. 过滤掉长度为1的session;过滤掉点击次数小于5的items。
+ 3. 训练集、测试集划分。原始数据集里最新日期七天内的作为训练集,更早之前的数据作为测试集。
```
cd data && python preprocess.py --dataset diginetica # or yoochoose
```
- 1. 以session_id为key合并原始数据集,得到每个session的日期,及顺序点击列表。
- 2. 过滤掉长度为1的session;过滤掉点击次数小于5的items。
- 3. 训练集、测试集划分。原始数据集里最新日期七天内的作为测试集,更早之前的数据作为测试集。
-
- Step3: 数据整理。 将训练文件统一放在data/train目录下,测试文件统一放在data/test目录下。
```
cat data/diginetica/train.txt | wc -l >> data/config.txt # or yoochoose1_4 or yoochoose1_64
@@ -40,37 +95,130 @@ python -m paddlerec.run -m paddlerec.models.recall.gnn
mv data/diginetica/train.txt data/train
mv data/diginetica/test.txt data/test
```
-数据处理完成后,data/train目录存放训练数据,data/test目录下存放测试数据,data/config.txt中存放数据统计信息,用以配置模型超参。
+数据处理完成后,data/train目录存放训练数据,data/test目录下存放测试数据,数据格式如下:
+```
+#session\tlabel
+10,11,12,12,13,14\t15
+```
+data/config.txt中存放数据统计信息,第一行代表训练集中item总数,用以配置模型词表大小,第二行代表训练集大小。
方便起见, 我们提供了一键式数据处理脚本:
```
sh data_prepare.sh diginetica # or yoochoose1_4 or yoochoose1_64
```
-## 实验配置
+## 运行环境
-为在真实数据中复现论文中的效果,你还需要完成如下几步,PaddleRec所有配置均通过修改模型目录下的config.yaml文件完成:
+PaddlePaddle>=1.7.2
-1. 真实数据配置。config.yaml中数据集相关配置见`dataset`字段,数据路径通过`data_path`进行配置。用户可以直接将workspace修改为当前项目目录的绝对路径完成设置。
-2. 超参配置。
- - batch_size: 修改config.yaml中dataset_train数据集的batch_size为100。
- - epochs: 修改config.yaml中runner的epochs为5。
- - sparse_feature_number: 不同训练数据集(diginetica or yoochoose)配置不一致,diginetica数据集配置为43098,yoochoose数据集配置为37484。具体见数据处理后得到的data/config.txt文件中第一行。
- - corpus_size: 不同训练数据集配置不一致,diginetica数据集配置为719470,yoochoose数据集配置为5917745。具体见数据处理后得到的data/config.txt文件中第二行。
+python 2.7/3.5/3.6/3.7
-## 训练
-在完成[实验配置](##实验配置)后,执行如下命令完成训练:
+PaddleRec >=0.1
+
+os : windows/linux/macos
+
+## 快速开始
+
+### 单机训练
+
+CPU环境
+
+在config.yaml文件中设置好设备,epochs等。
+
+```
+# select runner by name
+mode: [single_cpu_train, single_cpu_infer]
+# config of each runner.
+# runner is a kind of paddle training class, which wraps the train/infer process.
+runner:
+- name: single_cpu_train
+ class: train
+ # num of epochs
+ epochs: 2
+ # device to run training or infer
+ device: cpu
+ save_checkpoint_interval: 1 # save model interval of epochs
+ save_inference_interval: 1 # save inference
+ save_checkpoint_path: "increment_gnn" # save checkpoint path
+ save_inference_path: "inference_gnn" # save inference path
+ save_inference_feed_varnames: [] # feed vars of save inference
+ save_inference_fetch_varnames: [] # fetch vars of save inference
+ init_model_path: "" # load model path
+ print_interval: 1
+ phases: [phase1]
+```
+### 单机预测
+
+CPU环境
+
+在config.yaml文件中设置好epochs、device等参数。
+
+```
+- name: single_cpu_infer
+ class: infer
+ # device to run training or infer
+ device: cpu
+ print_interval: 1
+ init_model_path: "increment_gnn" # load model path
+ phases: [phase2]
```
-python -m paddlerec.run -m ./config.yaml
+
+### 运行
+```
+python -m paddlerec.run -m models/recall/gnn/config.yaml
```
-## 测试
-开始测试前,你需要完成如下几步配置:
-1. 修改config.yaml中的mode,为infer_runner。
-2. 修改config.yaml中的phase,为phase_infer,需按提示注释掉phase_trainer。
-3. 修改config.yaml中dataset_infer数据集的batch_size为100。
+### 结果展示
-完成上面两步配置后,执行如下命令完成测试:
+样例数据训练结果展示:
+
+```
+Running SingleStartup.
+Running SingleRunner.
+batch: 1, LOSS: [10.67443], InsCnt: [200.], RecallCnt: [0.], Acc(Recall@20): [0.]
+batch: 2, LOSS: [10.672471], InsCnt: [300.], RecallCnt: [0.], Acc(Recall@20): [0.]
+batch: 3, LOSS: [10.672463], InsCnt: [400.], RecallCnt: [1.], Acc(Recall@20): [0.0025]
+batch: 4, LOSS: [10.670724], InsCnt: [500.], RecallCnt: [2.], Acc(Recall@20): [0.004]
+batch: 5, LOSS: [10.66949], InsCnt: [600.], RecallCnt: [2.], Acc(Recall@20): [0.00333333]
+batch: 6, LOSS: [10.670102], InsCnt: [700.], RecallCnt: [2.], Acc(Recall@20): [0.00285714]
+batch: 7, LOSS: [10.671348], InsCnt: [800.], RecallCnt: [2.], Acc(Recall@20): [0.0025]
+...
+epoch 0 done, use time: 2926.6897077560425, global metrics: LOSS=[6.0788856], InsCnt=719400.0 RecallCnt=224033.0 Acc(Recall@20)=0.3114164581595774
+...
+epoch 4 done, use time: 3083.101449728012, global metrics: LOSS=[4.249889], InsCnt=3597000.0 RecallCnt=2070666.0 Acc(Recall@20)=0.5756647206005004
```
-python -m paddlerec.run -m ./config.yaml
+样例数据预测结果展示:
```
+Running SingleInferStartup.
+Running SingleInferRunner.
+load persistables from increment_gnn/2
+batch: 1, InsCnt: [200.], RecallCnt: [96.], Acc(Recall@20): [0.48], LOSS: [5.7198644]
+batch: 2, InsCnt: [300.], RecallCnt: [153.], Acc(Recall@20): [0.51], LOSS: [5.4096317]
+batch: 3, InsCnt: [400.], RecallCnt: [210.], Acc(Recall@20): [0.525], LOSS: [5.300991]
+batch: 4, InsCnt: [500.], RecallCnt: [258.], Acc(Recall@20): [0.516], LOSS: [5.6269655]
+batch: 5, InsCnt: [600.], RecallCnt: [311.], Acc(Recall@20): [0.5183333], LOSS: [5.39276]
+batch: 6, InsCnt: [700.], RecallCnt: [352.], Acc(Recall@20): [0.50285715], LOSS: [5.633842]
+batch: 7, InsCnt: [800.], RecallCnt: [406.], Acc(Recall@20): [0.5075], LOSS: [5.342844]
+batch: 8, InsCnt: [900.], RecallCnt: [465.], Acc(Recall@20): [0.51666665], LOSS: [4.918761]
+...
+Infer phase2 of epoch 0 done, use time: 549.1640813350677, global metrics: InsCnt=60800.0 RecallCnt=31083.0 Acc(Recall@20)=0.511233552631579, LOSS=[5.8957024]
+```
+
+## 论文复现
+
+用原论文的完整数据复现论文效果需要在config.yaml修改超参:
+- batch_size: 修改config.yaml中dataset_train数据集的batch_size为100。
+- epochs: 修改config.yaml中runner的epochs为5。
+- sparse_feature_number: 不同训练数据集(diginetica or yoochoose)配置不一致,diginetica数据集配置为43098,yoochoose数据集配置为37484。具体见数据处理后得到的data/config.txt文件中第一行。
+- corpus_size: 不同训练数据集配置不一致,diginetica数据集配置为719470,yoochoose数据集配置为5917745。具体见数据处理后得到的data/config.txt文件中第二行。
+
+使用cpu训练 5轮 测试Recall@20:0.51367
+
+修改后运行方案:修改config.yaml中的'workspace'为config.yaml的目录位置,执行
+```
+python -m paddlerec.run -m /home/your/dir/config.yaml #调试模式 直接指定本地config的绝对路径
+```
+
+## 进阶使用
+
+## FAQ
diff --git a/models/recall/gru4rec/config.yaml b/models/recall/gru4rec/config.yaml
index b0f8073eb89943bdd59f29566978a8e9b11742e8..e3c20c9f88a6344f563b6381d664ae94b79f964d 100644
--- a/models/recall/gru4rec/config.yaml
+++ b/models/recall/gru4rec/config.yaml
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-workspace: "paddlerec.models.recall.gru4rec"
+workspace: "models/recall/gru4rec"
dataset:
- name: dataset_train
diff --git a/models/recall/look-alike_recall/README.md b/models/recall/look-alike_recall/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..db4eda9a42c2fb63e44996738f466dde60113cbb
--- /dev/null
+++ b/models/recall/look-alike_recall/README.md
@@ -0,0 +1,164 @@
+# look-alike recall
+
+ 以下是本例的简要目录结构及说明:
+
+```
+├── config.yaml # 配置文件
+├── data # 样例数据文件夹
+│ ├── build_dataset.py # 生成样例数据程序示例
+│ └── train_data # 样例数据
+│ └── paddle_train.txt # 默认样例数据
+├── __init__.py
+├── model.py # 模型文件
+└── README.md # 文档
+```
+
+注:在阅读该示例前,建议您先了解以下内容:
+
+[paddlerec入门教程](https://github.com/PaddlePaddle/PaddleRec/blob/master/README.md)
+
+
+---
+## 内容
+
+- [模型简介](#模型简介)
+- [数据准备](#数据准备)
+- [运行环境](#运行环境)
+- [快速开始](#快速开始)
+- [论文复现](#论文复现)
+- [进阶使用](#进阶使用)
+- [FAQ](#FAQ)
+
+## 模型简介
+
+本目录目录模型文件参考论文 [《Real-time Attention Based Look-alike Model for Recommender System》]( https://arxiv.org/pdf/1906.05022),是发表在KDD 19上的一篇论文,文章指出目前基于深度学习的模型没有能够缓解"马太效应",模型倾向于偏向拥有比较多的特征的头部资源,而那些同样优质的缺少用户交互信息的长尾资源得不到充分的曝光。文章提出推荐广告的经典算法 look-alike 是缓解"马太效应"一个不错的选择。但是受限于推荐领域有别于推荐广告严格的实时性要求,该算法未被大规模采用。基于以上,文章提出了一种实时性的基于attention的looka-like算法 RALM。
+
+本项目在paddlepaddle上主要实现RALM的网络结构,其他更多实时性的工程尝试请参考原论文。因为原论文没有在开源数据集上验证模型效果,本项目提供了100行样例数据。验证模型的正确性,若进行精度验证,请参考样例数据格式或者自定义更改相关配置构建自己的数据集,在工程环境中进行验证。
+
+模型大体结构为双塔结构,可以理解为target user 和 user seeds两个塔。使用论文中提出的local_attention 和 global_attention模块。损失函数采用cosine similarity损失函数。
+
+本项目支持功能
+
+训练:单机CPU、单机单卡GPU、单机多卡GPU、本地模拟参数服务器训练、增量训练,配置请参考 [启动训练](https://github.com/PaddlePaddle/PaddleRec/blob/master/doc/train.md)
+
+预测:单机CPU、单机单卡GPU ;配置请参考[PaddleRec 离线预测](https://github.com/PaddlePaddle/PaddleRec/blob/master/doc/predict.md)
+
+## 数据准备
+
+数据地址:[样例数据](./data/train_data/paddle_train.txt)
+
+样例数据中每条样本包含三个slot:user_seeds, target_user, label。
+ (1) user_seeds: 基于当前的资源圈定的种子用户
+ (2) target_user: 目标用户
+ (3) label: 点击与否
+
+注:本项目提供的样例数据为完全fake的,没有任何实际参考价值。用户可根据样例数据格式自行构建基于自己项目或者工程的数据集。
+
+执行build_dataset.py生成训练集和测试集
+
+```
+cd data
+python build_dataset.py
+```
+
+运行后生成的数据格式为3个离散化特征,用'\t'切分, 对应的slot是user_seeds, target_user, label
+```
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+```
+
+
+## 运行环境
+
+PaddlePaddle>=1.7.2
+
+python 2.7/3.5/3.6/3.7
+
+PaddleRec >=0.1
+
+os : windows/linux/macos
+
+
+
+## 快速开始
+
+### 单机训练
+
+CPU环境
+
+在config.yaml文件中设置好设备,epochs等。
+
+```
+# select runner by name
+mode: [single_cpu_train, single_cpu_infer]
+# config of each runner.
+# runner is a kind of paddle training class, which wraps the train/infer process.
+runner:
+- name: single_cpu_train
+ class: train
+ # num of epochs
+ epochs: 4
+ # device to run training or infer
+ device: cpu
+ save_checkpoint_interval: 2 # save model interval of epochs
+ save_inference_interval: 4 # save inference
+ save_checkpoint_path: "increment_model" # save checkpoint path
+ save_inference_path: "inference" # save inference path
+ save_inference_feed_varnames: [] # feed vars of save inference
+ save_inference_fetch_varnames: [] # fetch vars of save inference
+ init_model_path: "" # load model path
+ print_interval: 10
+ phases: [phase1]
+```
+
+### 单机预测
+
+CPU环境
+
+在config.yaml文件中设置好epochs、device等参数。
+
+```
+- name: single_cpu_infer
+ class: infer
+ # num of epochs
+ epochs: 1
+ # device to run training or infer
+ device: cpu #选择预测的设备
+ init_model_path: "increment_dnn" # load model path
+ phases: [phase2]
+```
+
+### 运行
+```
+python -m paddlerec.run -m models/recall/look-alike_recall/config.yaml
+```
+
+
+### 结果展示
+
+样例数据训练结果展示:
+
+```
+PaddleRec: Runner train_runner Begin
+Executor Mode: train
+processor_register begin
+Running SingleInstance.
+Running SingleNetwork.
+Running SingleStartup.
+Running SingleRunner.
+I0729 15:51:44.029929 22883 parallel_executor.cc:440] The Program will be executed on CPU using ParallelExecutor, 1 cards are used, so 1 programs are executed in parallel.
+I0729 15:51:44.031812 22883 build_strategy.cc:365] SeqOnlyAllReduceOps:0, num_trainers:1
+I0729 15:51:44.033733 22883 parallel_executor.cc:307] Inplace strategy is enabled, when build_strategy.enable_inplace = True
+I0729 15:51:44.035027 22883 parallel_executor.cc:375] Garbage collection strategy is enabled, when FLAGS_eager_delete_tensor_gb = 0
+batch: 1, BATCH_AUC: [0.], AUC: [0.]
+batch: 2, BATCH_AUC: [0.], AUC: [0.]
+epoch 0 done, use time: 0.0433671474457
+PaddleRec Finish
+```
+
+## 论文复现
+
+论文中没有提供基于公开数据集的实验结果。
+
+## 进阶使用
+
+## FAQ
diff --git a/models/recall/look-alike_recall/__init__.py b/models/recall/look-alike_recall/__init__.py
new file mode 100755
index 0000000000000000000000000000000000000000..abf198b97e6e818e1fbe59006f98492640bcee54
--- /dev/null
+++ b/models/recall/look-alike_recall/__init__.py
@@ -0,0 +1,13 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
diff --git a/models/recall/look-alike_recall/config.yaml b/models/recall/look-alike_recall/config.yaml
new file mode 100755
index 0000000000000000000000000000000000000000..5b471822de0bb492c202e723ff642834040fae61
--- /dev/null
+++ b/models/recall/look-alike_recall/config.yaml
@@ -0,0 +1,69 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
+
+# global settings
+debug: false
+workspace: "models/recall/look-alike_recall"
+
+dataset:
+- name: sample_1
+ type: DataLoader
+ batch_size: 32
+ data_path: "{workspace}/data/train_data"
+ sparse_slots: "label user_seeds target_user"
+- name: infer_sample
+ type: DataLoader
+ batch_size: 32
+ data_path: "{workspace}/data/train_data"
+ sparse_slots: "label user_seed target_user"
+
+hyper_parameters:
+ optimizer:
+ class: SGD
+ learning_rate: 0.0001
+ use_DataLoader: True
+ user_emb_size: 96
+ user_count: 100000
+ seeds_num: 20
+ transformed_size: 96
+
+
+mode: train_runner
+
+runner:
+ - name: train_runner
+ class: train
+ epochs: 1
+ device: cpu
+ init_model_path: ""
+ save_checkpoint_interval: 1
+ save_inference_interval: 1
+ save_checkpoint_path: "increment"
+ save_inference_path: "inference"
+ print_interval: 1
+ - name: infer_runner
+ class: infer
+ device: cpu
+ init_model_path: "increment/0"
+ print_interval: 1
+
+phase:
+- name: phase1
+ model: "{workspace}/model.py"
+ dataset_name: sample_1
+ thread_num: 1
+#- name: infer_phase
+# model: "{workspace}/model.py"
+# dataset_name: infer_sample
+# thread_num: 1
diff --git a/models/recall/look-alike_recall/data/build_dataset.py b/models/recall/look-alike_recall/data/build_dataset.py
new file mode 100755
index 0000000000000000000000000000000000000000..3b82dafc757d23ddfc0e926b47d7b4a091b238c7
--- /dev/null
+++ b/models/recall/look-alike_recall/data/build_dataset.py
@@ -0,0 +1,38 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
+
+from __future__ import print_function
+import random
+import pickle
+
+
+def print_to_file(data, fout, slot):
+ if not isinstance(data, list):
+ data = [data]
+ for i in range(len(data)):
+ fout.write(slot + ":" + str(data[i]))
+ fout.write(' ')
+
+
+fake_seed_users = [i for i in range(2, 20)]
+target_user = [1]
+length = 100
+print("make train data")
+with open("paddle_train.txt", "w") as fout:
+ for _ in range(length):
+
+ print_to_file(fake_seed_users, fout, "user_seeds")
+ print_to_file(target_user, fout, "target_user")
+ print_to_file(1, fout, "label")
+ fout.write("\n")
diff --git a/models/recall/look-alike_recall/data/train_data/paddle_train.txt b/models/recall/look-alike_recall/data/train_data/paddle_train.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a6a1f92552758f212d53c6bed2e8403eedb94f57
--- /dev/null
+++ b/models/recall/look-alike_recall/data/train_data/paddle_train.txt
@@ -0,0 +1,100 @@
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
+user_seeds:2 user_seeds:3 user_seeds:4 user_seeds:5 user_seeds:6 user_seeds:7 user_seeds:8 user_seeds:9 user_seeds:10 user_seeds:11 user_seeds:12 user_seeds:13 user_seeds:14 user_seeds:15 user_seeds:16 user_seeds:17 user_seeds:18 user_seeds:19 target_user:1 label:1
diff --git a/models/recall/look-alike_recall/model.py b/models/recall/look-alike_recall/model.py
new file mode 100755
index 0000000000000000000000000000000000000000..9eb7627733485f5825379c5b6b7b27a349d16f84
--- /dev/null
+++ b/models/recall/look-alike_recall/model.py
@@ -0,0 +1,126 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
+
+import math
+
+import numpy as np
+import paddle.fluid as fluid
+import paddle.fluid.layers as layers
+
+from paddlerec.core.utils import envs
+from paddlerec.core.model import ModelBase
+
+
+class Model(ModelBase):
+ def __init__(self, config):
+ ModelBase.__init__(self, config)
+
+ def _init_hyper_parameters(self):
+ self.user_emb_size = envs.get_global_env(
+ "hyper_parameters.user_emb_size", 64)
+ self.user_count = envs.get_global_env("hyper_parameters.user_count",
+ 100000)
+ self.transformed_size = envs.get_global_env(
+ "hyper_parameter.transformed_size", 96)
+
+ def local_attention_unit(self, user_seeds, target_user):
+ wl = fluid.layers.create_parameter(
+ shape=[self.user_emb_size, self.user_emb_size], dtype="float32")
+ out = fluid.layers.matmul(user_seeds,
+ wl) # batch_size * max_len * emb_size
+ out = fluid.layers.matmul(
+ out, target_user, transpose_y=True) # batch_size * max_len * 1
+ out = fluid.layers.tanh(out)
+ out = fluid.layers.softmax(out, axis=-2)
+ out = user_seeds * out
+ out = fluid.layers.reduce_sum(out, dim=1) # batch_size * emb_size
+ return out
+
+ def global_attention_unit(self, user_seeds):
+ wg = fluid.layers.create_parameter(
+ shape=[self.user_emb_size, self.user_emb_size], dtype="float32")
+ out = fluid.layers.matmul(user_seeds, wg)
+ out = fluid.layers.tanh(out)
+ out = fluid.layers.matmul(out, user_seeds, transpose_y=True)
+ out = fluid.layers.softmax(out)
+ out = fluid.layers.matmul(out, user_seeds)
+ out = fluid.layers.reduce_sum(out, dim=1)
+ return out
+
+ def net(self, inputs, is_infer=False):
+
+ init_value_ = 0.1
+
+ user_seeds = self._sparse_data_var[1]
+ target_user = self._sparse_data_var[2]
+ self.label = self._sparse_data_var[0]
+
+ user_emb_attr = fluid.ParamAttr(name="user_emb")
+
+ user_seeds_emb = fluid.embedding(
+ input=user_seeds,
+ size=[self.user_count, self.user_emb_size],
+ param_attr=user_emb_attr,
+ is_sparse=True)
+
+ target_user_emb = fluid.embedding(
+ input=target_user,
+ size=[self.user_count, self.user_emb_size],
+ param_attr=user_emb_attr,
+ is_sparse=True) # batch_size * 1 * emb_size
+ user_seeds_emb = fluid.layers.reduce_sum(
+ user_seeds_emb, dim=1) # batch_size(with lod) * emb_size
+
+ pad_value = fluid.layers.assign(input=np.array(
+ [0.0], dtype=np.float32))
+ user_seeds_emb, _ = fluid.layers.sequence_pad(
+ user_seeds_emb, pad_value
+ ) # batch_size(without lod) * max_sequence_length(in batch) * emb_size
+
+ target_transform_matrix = fluid.layers.create_parameter(
+ shape=[self.user_emb_size, self.transformed_size], dtype="float32")
+ seeds_transform_matrix = fluid.layers.create_parameter(
+ shape=[self.user_emb_size, self.transformed_size], dtype="float32")
+ user_seeds_emb_transformed = fluid.layers.matmul(
+ user_seeds_emb, seeds_transform_matrix)
+ target_user_emb_transormed = fluid.layers.matmul(
+ target_user_emb, target_transform_matrix)
+
+ seeds_tower = self.local_attention_unit(
+ user_seeds_emb_transformed,
+ target_user_emb_transormed) + self.global_attention_unit(
+ user_seeds_emb_transformed)
+
+ target_tower = fluid.layers.reduce_sum(
+ target_user_emb_transormed, dim=1)
+
+ score = fluid.layers.cos_sim(seeds_tower, target_tower)
+
+ y_dnn = fluid.layers.cast(self.label, dtype="float32")
+ self.predict = fluid.layers.sigmoid(score)
+ cost = fluid.layers.log_loss(
+ input=score, label=fluid.layers.cast(self.label, "float32"))
+ avg_cost = fluid.layers.reduce_sum(cost)
+
+ self._cost = avg_cost
+
+ predict_2d = fluid.layers.concat([1 - self.predict, self.predict], 1)
+ label_int = fluid.layers.cast(self.label, 'int64')
+ auc_var, batch_auc_var, _ = fluid.layers.auc(input=predict_2d,
+ label=label_int,
+ slide_steps=0)
+ self._metrics["AUC"] = auc_var
+ self._metrics["BATCH_AUC"] = batch_auc_var
+ if is_infer:
+ self._infer_results["AUC"] = auc_var
diff --git a/models/recall/ncf/config.yaml b/models/recall/ncf/config.yaml
index 3c87eb3b4ea76479348810f3f6ea9ec1f6644a32..f7818a97bb6dc51a6819f30d4bffe9c3eebe2da2 100644
--- a/models/recall/ncf/config.yaml
+++ b/models/recall/ncf/config.yaml
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-workspace: "paddlerec.models.recall.ncf"
+workspace: "models/recall/ncf"
dataset:
- name: dataset_train
diff --git a/models/recall/readme.md b/models/recall/readme.md
index e5589188858a423a40adb28d7c70f8be800cdc86..f494344fac1ec4a208b3b905ff4ac7df4ef9f35a 100755
--- a/models/recall/readme.md
+++ b/models/recall/readme.md
@@ -25,6 +25,7 @@
| NCF | Neural Collaborative Filtering | [WWW 2017][Neural Collaborative Filtering](https://arxiv.org/pdf/1708.05031.pdf) |
| GNN | SR-GNN | [AAAI 2019][Session-based Recommendation with Graph Neural Networks](https://arxiv.org/abs/1811.00855) |
| Fasttext | fasttext | [EACL 2017][Bag of Tricks for Efficient Text Classification](https://www.aclweb.org/anthology/E17-2068.pdf) |
+| RALM | Real-time Attention Based Look-alike Model | [KDD 2019][Real-time Attention Based Look-alike Model for Recommender System](https://arxiv.org/pdf/1906.05022.pdf) |
下面是每个模型的简介(注:图片引用自链接中的论文)
@@ -61,12 +62,15 @@
## 使用教程(快速开始)
###
```shell
-python -m paddlerec.run -m paddlerec.models.recall.word2vec # word2vec
-python -m paddlerec.run -m paddlerec.models.recall.ssr # ssr
-python -m paddlerec.run -m paddlerec.models.recall.gru4rec # gru4rec
-python -m paddlerec.run -m paddlerec.models.recall.gnn # gnn
-python -m paddlerec.run -m paddlerec.models.recall.ncf # ncf
-python -m paddlerec.run -m paddlerec.models.recall.youtube_dnn # youtube_dnn
+git clone https://github.com/PaddlePaddle/PaddleRec.git paddle-rec
+cd paddle-rec
+
+python -m paddlerec.run -m models/recall/word2vec/config.yaml # word2vec
+python -m paddlerec.run -m models/recall/ssr/config.yaml # ssr
+python -m paddlerec.run -m models/recall/gru4rec/config.yaml # gru4rec
+python -m paddlerec.run -m models/recall/gnn/config.yaml # gnn
+python -m paddlerec.run -m models/recall/ncf/config.yaml # ncf
+python -m paddlerec.run -m models/recall/youtube_dnn/config.yaml # youtube_dnn
```
## 使用教程(复现论文)
@@ -86,6 +90,9 @@ sh data_prepare.sh
### 训练
```bash
+git clone https://github.com/PaddlePaddle/PaddleRec.git paddle-rec
+cd paddle-rec
+
cd modles/recall/gnn # 进入选定好的召回模型的目录 以gnn为例
python -m paddlerec.run -m ./config.yaml # 自定义修改超参后,指定配置文件,使用自定义配置
```
diff --git a/models/recall/ssr/config.yaml b/models/recall/ssr/config.yaml
index 5152c20c04cf03476ed5b4ad18d30b823807a2ac..269b1a2e5fc45b0126e408f701fc47a82d372db8 100644
--- a/models/recall/ssr/config.yaml
+++ b/models/recall/ssr/config.yaml
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-workspace: "paddlerec.models.recall.ssr"
+workspace: "models/recall/ssr"
dataset:
- name: dataset_train
diff --git a/models/recall/word2vec/config.yaml b/models/recall/word2vec/config.yaml
index 34a25e59ecfa4ccd292a3b6e358c83ac827ed59f..96f47221f26af19dc6cb505d34a27ca1295b4b50 100755
--- a/models/recall/word2vec/config.yaml
+++ b/models/recall/word2vec/config.yaml
@@ -11,7 +11,7 @@
# 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.
-workspace: "paddlerec.models.recall.word2vec"
+workspace: "models/recall/word2vec"
# list of dataset
dataset:
diff --git a/models/recall/youtube_dnn/config.yaml b/models/recall/youtube_dnn/config.yaml
index 94aff6c692fc878a7e169af623f609eee0c767b8..f77755150cd84b5a5c30a3736aa15315ce239364 100644
--- a/models/recall/youtube_dnn/config.yaml
+++ b/models/recall/youtube_dnn/config.yaml
@@ -13,7 +13,7 @@
# limitations under the License.
-workspace: "paddlerec.models.recall.youtube_dnn"
+workspace: "models/recall/youtube_dnn"
dataset:
- name: dataset_train
diff --git a/models/rerank/listwise/config.yaml b/models/rerank/listwise/config.yaml
index 6d06ab09a58e44976af5219fd34dd9fd41525eff..9d04dc1ecb6089a7c34c41e12f547afe77e64916 100644
--- a/models/rerank/listwise/config.yaml
+++ b/models/rerank/listwise/config.yaml
@@ -13,33 +13,34 @@
# limitations under the License.
-workspace: "paddlerec.models.rerank.listwise"
+workspace: "models/rerank/listwise"
dataset:
- name: dataset_train
+ batch_size: 5
type: DataLoader
data_path: "{workspace}/data/train"
data_converter: "{workspace}/random_reader.py"
- name: dataset_infer
+ batch_size: 5
type: DataLoader
data_path: "{workspace}/data/test"
data_converter: "{workspace}/random_reader.py"
hyper_parameters:
+ optimizer:
+ class: sgd
+ learning_rate: 0.01
+ strategy: async
hidden_size: 128
user_vocab: 200
item_vocab: 1000
item_len: 5
embed_size: 16
batch_size: 1
- optimizer:
- class: sgd
- learning_rate: 0.01
- strategy: async
#use infer_runner mode and modify 'phase' below if infer
-mode: train_runner
-#mode: infer_runner
+mode: [train_runner, infer_runner]
runner:
- name: train_runner
@@ -48,19 +49,22 @@ runner:
epochs: 3
save_checkpoint_interval: 2
save_inference_interval: 4
- save_checkpoint_path: "increment"
+ save_checkpoint_path: "increment_listwise"
save_inference_path: "inference"
+ print_interval: 1
+ phases: [train]
- name: infer_runner
class: infer
- init_model_path: "increment/0"
+ init_model_path: "increment_listwise/2"
device: cpu
+ phases: [infer]
phase:
- name: train
model: "{workspace}/model.py"
dataset_name: dataset_train
thread_num: 1
- #- name: infer
- # model: "{workspace}/model.py"
- # dataset_name: dataset_infer
- # thread_num: 1
+- name: infer
+ model: "{workspace}/model.py"
+ dataset_name: dataset_infer
+ thread_num: 1
diff --git a/models/rerank/readme.md b/models/rerank/readme.md
index f889a58e6c2111e9c81a8d5ce7c1c607bafa0d0d..a24dde91bbd74b5fa35f17d05d1fe478cbcc5306 100755
--- a/models/rerank/readme.md
+++ b/models/rerank/readme.md
@@ -28,7 +28,10 @@
## 使用教程(快速开始)
```shell
-python -m paddlerec.run -m paddlerec.models.rerank.listwise # listwise
+git clone https://github.com/PaddlePaddle/PaddleRec.git paddle-rec
+cd paddle-rec
+
+python -m paddlerec.run -m models/rerank/listwise/config.yaml # listwise
```
## 使用教程(复现论文)
diff --git a/models/treebased/tdm/README.md b/models/treebased/tdm/README.md
index e70b8f808ac95d7a1b4d712e1defa187ad0572c6..14f25323df42b8c0e9417a0eb24e345d9da6221f 100644
--- a/models/treebased/tdm/README.md
+++ b/models/treebased/tdm/README.md
@@ -8,7 +8,10 @@
2. 基于单机模型,可以进行分布式的参数服务器训练
```shell
-python -m paddlerec.run -m paddlerec.models.treebased.tdm
+git clone https://github.com/PaddlePaddle/PaddleRec.git paddle-rec
+cd paddle-rec
+
+python -m paddlerec.run -m models/treebased/tdm/config.yaml
```
## 树结构的准备
diff --git a/models/treebased/tdm/config.yaml b/models/treebased/tdm/config.yaml
index e5920803a7d7aeec20dc0a3375273952559733d6..fed727ad3f71406c5645f08c69d0736eedf3d084 100755
--- a/models/treebased/tdm/config.yaml
+++ b/models/treebased/tdm/config.yaml
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-workspace: "paddlerec.models.treebased.tdm"
+workspace: "models/treebased/tdm"
# list of dataset
dataset:
diff --git a/run.py b/run.py
index 6340adfc1c6026d7c67f5576ba8d0230055ec19d..c916ecd0ab3b0efe71ef86a4bf1d7f357aa9d563 100755
--- a/run.py
+++ b/run.py
@@ -16,7 +16,6 @@ import os
import subprocess
import sys
import argparse
-import tempfile
import warnings
import copy
@@ -39,6 +38,7 @@ def engine_registry():
engines["TRANSPILER"]["INFER"] = single_infer_engine
engines["TRANSPILER"]["LOCAL_CLUSTER_TRAIN"] = local_cluster_engine
engines["TRANSPILER"]["CLUSTER_TRAIN"] = cluster_engine
+ engines["TRANSPILER"]["ONLINE_LEARNING"] = online_learning
engines["PSLIB"]["TRAIN"] = local_mpi_engine
engines["PSLIB"]["LOCAL_CLUSTER_TRAIN"] = local_mpi_engine
engines["PSLIB"]["CLUSTER_TRAIN"] = cluster_mpi_engine
@@ -259,6 +259,20 @@ def single_infer_engine(args):
return trainer
+def online_learning(args):
+ trainer = "OnlineLearningTrainer"
+ single_envs = {}
+ single_envs["train.trainer.trainer"] = trainer
+ single_envs["train.trainer.threads"] = "2"
+ single_envs["train.trainer.engine"] = "online_learning"
+ single_envs["train.trainer.platform"] = envs.get_platform()
+ print("use {} engine to run model: {}".format(trainer, args.model))
+
+ set_runtime_envs(single_envs, args.model)
+ trainer = TrainerFactory.create(args.model)
+ return trainer
+
+
def cluster_engine(args):
def master():
from paddlerec.core.engine.cluster.cluster import ClusterEngine
diff --git a/setup.py b/setup.py
index 54001d6e26537e74c9edf518c1c1b7ae945969ad..110b712329dbac22ff8413e1ae454cfb86a76ccf 100644
--- a/setup.py
+++ b/setup.py
@@ -38,15 +38,18 @@ readme = ""
def build(dirname):
package_dir = os.path.dirname(os.path.abspath(__file__))
+
shutil.copytree(
- package_dir, dirname, ignore=shutil.ignore_patterns(".git"))
+ package_dir,
+ dirname,
+ ignore=shutil.ignore_patterns(".git", "models", "build", "dist",
+ "*.md"))
+
os.mkdir(os.path.join(dirname, "paddlerec"))
shutil.move(
os.path.join(dirname, "core"), os.path.join(dirname, "paddlerec"))
shutil.move(
os.path.join(dirname, "doc"), os.path.join(dirname, "paddlerec"))
- shutil.move(
- os.path.join(dirname, "models"), os.path.join(dirname, "paddlerec"))
shutil.move(
os.path.join(dirname, "tests"), os.path.join(dirname, "paddlerec"))
shutil.move(
@@ -63,17 +66,8 @@ def build(dirname):
package_dir = {'': dirname}
package_data = {}
- models_copy = [
- 'data/*.txt', 'data/*/*.txt', '*.yaml', '*.sh', 'tree/*.npy',
- 'tree/*.txt', 'data/sample_data/*', 'data/sample_data/train/*',
- 'data/sample_data/infer/*', 'data/*/*.csv', 'Criteo_data/*',
- 'Criteo_data/sample_data/train/*'
- ]
-
engine_copy = ['*/*.sh', '*/*.template']
for package in packages:
- if package.startswith("paddlerec.models."):
- package_data[package] = models_copy
if package.startswith("paddlerec.core.engine"):
package_data[package] = engine_copy
@@ -98,16 +92,6 @@ build(dirname)
shutil.rmtree(dirname)
print(u'''
-\033[32m
-██████╗ █████╗ ██████╗ ██████╗ ██╗ ███████╗██████╗ ███████╗ ██████╗
-██╔══██╗██╔══██╗██╔══██╗██╔══██╗██║ ██╔════╝██╔══██╗██╔════╝██╔════╝
-██████╔╝███████║██║ ██║██║ ██║██║ █████╗ ██████╔╝█████╗ ██║
-██╔═══╝ ██╔══██║██║ ██║██║ ██║██║ ██╔══╝ ██╔══██╗██╔══╝ ██║
-██║ ██║ ██║██████╔╝██████╔╝███████╗███████╗██║ ██║███████╗╚██████╗
-╚═╝ ╚═╝ ╚═╝╚═════╝ ╚═════╝ ╚══════╝╚══════╝╚═╝ ╚═╝╚══════╝ ╚═════╝
-\033[0m
-\033[34m
Installation Complete. Congratulations!
How to use it ? Please visit our webside: https://github.com/PaddlePaddle/PaddleRec
-\033[0m
''')
diff --git a/tests/test_auc_metrics.py b/tests/test_auc_metrics.py
new file mode 100644
index 0000000000000000000000000000000000000000..0fc55233884ac853b6fe8c1e0bac0d297605c704
--- /dev/null
+++ b/tests/test_auc_metrics.py
@@ -0,0 +1,89 @@
+# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
+
+from __future__ import print_function
+
+import unittest
+import numpy as np
+from paddlerec.core.metrics import AUC
+import paddle
+import paddle.fluid as fluid
+
+
+class TestAUC(unittest.TestCase):
+ def setUp(self):
+ self.ins_num = 64
+ self.batch_nums = 3
+
+ self.datas = []
+ for i in range(self.batch_nums):
+ probs = np.random.uniform(0, 1.0,
+ (self.ins_num, 2)).astype('float32')
+ labels = np.random.choice(range(2), self.ins_num).reshape(
+ (self.ins_num, 1)).astype('int64')
+ self.datas.append((probs, labels))
+
+ self.place = fluid.core.CPUPlace()
+
+ self.num_thresholds = 2**12
+ python_auc = fluid.metrics.Auc(name="auc",
+ curve='ROC',
+ num_thresholds=self.num_thresholds)
+ for i in range(self.batch_nums):
+ python_auc.update(self.datas[i][0], self.datas[i][1])
+
+ self.auc = np.array(python_auc.eval())
+
+ def build_network(self):
+ predict = fluid.data(
+ name="predict", shape=[-1, 2], dtype='float32', lod_level=0)
+ label = fluid.data(
+ name="label", shape=[-1, 1], dtype='int64', lod_level=0)
+
+ auc = AUC(input=predict,
+ label=label,
+ num_thresholds=self.num_thresholds,
+ curve='ROC')
+ return auc
+
+ def test_forward(self):
+ precision_recall = self.build_network()
+ metrics = precision_recall.get_result()
+ fetch_vars = []
+ metric_keys = []
+ for item in metrics.items():
+ fetch_vars.append(item[1])
+ metric_keys.append(item[0])
+
+ exe = fluid.Executor(self.place)
+ exe.run(fluid.default_startup_program())
+ for i in range(self.batch_nums):
+ outs = exe.run(
+ fluid.default_main_program(),
+ feed={'predict': self.datas[i][0],
+ 'label': self.datas[i][1]},
+ fetch_list=fetch_vars,
+ return_numpy=True)
+
+ outs = dict(zip(metric_keys, outs))
+ self.assertTrue(np.allclose(outs['AUC'], self.auc))
+
+ def test_exception(self):
+ self.assertRaises(Exception, AUC)
+ self.assertRaises(
+ Exception, AUC, input=self.datas[0][0], label=self.datas[0][1]),
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/test_pairwise_pn.py b/tests/test_pairwise_pn.py
new file mode 100644
index 0000000000000000000000000000000000000000..c10532afc7df7420e0ee6465dcb1c20ac9977259
--- /dev/null
+++ b/tests/test_pairwise_pn.py
@@ -0,0 +1,95 @@
+# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
+
+from __future__ import print_function
+
+import unittest
+import numpy as np
+from paddlerec.core.metrics import PosNegRatio
+import paddle
+import paddle.fluid as fluid
+
+
+class TestPosNegRatio(unittest.TestCase):
+ def setUp(self):
+ self.ins_num = 64
+ self.batch_nums = 3
+
+ self.datas = []
+ self.right_cnt = 0.0
+ self.wrong_cnt = 0.0
+ for i in range(self.batch_nums):
+ neg_score = np.random.uniform(0, 1.0,
+ (self.ins_num, 1)).astype('float32')
+ pos_score = np.random.uniform(0, 1.0,
+ (self.ins_num, 1)).astype('float32')
+
+ right_cnt = np.sum(np.less(neg_score, pos_score)).astype('int32')
+ wrong_cnt = np.sum(np.less_equal(pos_score, neg_score)).astype(
+ 'int32')
+ self.right_cnt += float(right_cnt)
+ self.wrong_cnt += float(wrong_cnt)
+ self.datas.append((pos_score, neg_score))
+
+ self.place = fluid.core.CPUPlace()
+
+ def build_network(self):
+ pos_score = fluid.data(
+ name="pos_score", shape=[-1, 1], dtype='float32', lod_level=0)
+
+ neg_score = fluid.data(
+ name="neg_score", shape=[-1, 1], dtype='float32', lod_level=0)
+
+ pairwise_pn = PosNegRatio(pos_score=pos_score, neg_score=neg_score)
+ return pairwise_pn
+
+ def test_forward(self):
+ pn = self.build_network()
+ metrics = pn.get_result()
+ fetch_vars = []
+ metric_keys = []
+ for item in metrics.items():
+ fetch_vars.append(item[1])
+ metric_keys.append(item[0])
+
+ exe = fluid.Executor(self.place)
+ exe.run(fluid.default_startup_program())
+ for i in range(self.batch_nums):
+ outs = exe.run(fluid.default_main_program(),
+ feed={
+ 'pos_score': self.datas[i][0],
+ 'neg_score': self.datas[i][1]
+ },
+ fetch_list=fetch_vars,
+ return_numpy=True)
+
+ outs = dict(zip(metric_keys, outs))
+ self.assertTrue(np.allclose(outs['RightCnt'], self.right_cnt))
+ self.assertTrue(np.allclose(outs['WrongCnt'], self.wrong_cnt))
+ self.assertTrue(
+ np.allclose(outs['PN'],
+ np.array((self.right_cnt + 1.0) / (self.wrong_cnt + 1.0
+ ))))
+
+ def test_exception(self):
+ self.assertRaises(Exception, PosNegRatio)
+ self.assertRaises(
+ Exception,
+ PosNegRatio,
+ pos_score=self.datas[0][0],
+ neg_score=self.datas[0][1]),
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/test_precision_recall_metrics.py b/tests/test_precision_recall_metrics.py
new file mode 100644
index 0000000000000000000000000000000000000000..a76c81ca157c4e88a20827feb9460ccada22e47b
--- /dev/null
+++ b/tests/test_precision_recall_metrics.py
@@ -0,0 +1,162 @@
+# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
+
+from __future__ import print_function
+
+import unittest
+import numpy as np
+from paddlerec.core.metrics import PrecisionRecall
+import paddle
+import paddle.fluid as fluid
+
+
+def calc_precision(tp_count, fp_count):
+ if tp_count > 0.0 or fp_count > 0.0:
+ return tp_count / (tp_count + fp_count)
+ return 1.0
+
+
+def calc_recall(tp_count, fn_count):
+ if tp_count > 0.0 or fn_count > 0.0:
+ return tp_count / (tp_count + fn_count)
+ return 1.0
+
+
+def calc_f1_score(precision, recall):
+ if precision > 0.0 or recall > 0.0:
+ return 2 * precision * recall / (precision + recall)
+ return 0.0
+
+
+def get_states(idxs, labels, cls_num, weights=None, batch_nums=1):
+ ins_num = idxs.shape[0]
+ # TP FP TN FN
+ states = np.zeros((cls_num, 4)).astype('float32')
+ for i in range(ins_num):
+ w = weights[i] if weights is not None else 1.0
+ idx = idxs[i][0]
+ label = labels[i][0]
+ if idx == label:
+ states[idx][0] += w
+ for j in range(cls_num):
+ states[j][2] += w
+ states[idx][2] -= w
+ else:
+ states[label][3] += w
+ states[idx][1] += w
+ for j in range(cls_num):
+ states[j][2] += w
+ states[label][2] -= w
+ states[idx][2] -= w
+ return states
+
+
+def compute_metrics(states, cls_num):
+ total_tp_count = 0.0
+ total_fp_count = 0.0
+ total_fn_count = 0.0
+ macro_avg_precision = 0.0
+ macro_avg_recall = 0.0
+ for i in range(cls_num):
+ total_tp_count += states[i][0]
+ total_fp_count += states[i][1]
+ total_fn_count += states[i][3]
+ macro_avg_precision += calc_precision(states[i][0], states[i][1])
+ macro_avg_recall += calc_recall(states[i][0], states[i][3])
+ metrics = []
+ macro_avg_precision /= cls_num
+ macro_avg_recall /= cls_num
+ metrics.append(macro_avg_precision)
+ metrics.append(macro_avg_recall)
+ metrics.append(calc_f1_score(macro_avg_precision, macro_avg_recall))
+ micro_avg_precision = calc_precision(total_tp_count, total_fp_count)
+ metrics.append(micro_avg_precision)
+ micro_avg_recall = calc_recall(total_tp_count, total_fn_count)
+ metrics.append(micro_avg_recall)
+ metrics.append(calc_f1_score(micro_avg_precision, micro_avg_recall))
+ return np.array(metrics).astype('float32')
+
+
+class TestPrecisionRecall(unittest.TestCase):
+ def setUp(self):
+ self.ins_num = 64
+ self.cls_num = 10
+ self.batch_nums = 3
+
+ self.datas = []
+ self.states = np.zeros((self.cls_num, 4)).astype('float32')
+
+ for i in range(self.batch_nums):
+ probs = np.random.uniform(0, 1.0, (self.ins_num,
+ self.cls_num)).astype('float32')
+ idxs = np.array(np.argmax(
+ probs, axis=1)).reshape(self.ins_num, 1).astype('int32')
+ labels = np.random.choice(range(self.cls_num),
+ self.ins_num).reshape(
+ (self.ins_num, 1)).astype('int32')
+ self.datas.append((probs, labels))
+ states = get_states(idxs, labels, self.cls_num)
+ self.states = np.add(self.states, states)
+ self.metrics = compute_metrics(self.states, self.cls_num)
+
+ self.place = fluid.core.CPUPlace()
+
+ def build_network(self):
+ predict = fluid.data(
+ name="predict",
+ shape=[-1, self.cls_num],
+ dtype='float32',
+ lod_level=0)
+ label = fluid.data(
+ name="label", shape=[-1, 1], dtype='int32', lod_level=0)
+
+ precision_recall = PrecisionRecall(
+ input=predict, label=label, class_num=self.cls_num)
+ return precision_recall
+
+ def test_forward(self):
+ precision_recall = self.build_network()
+ metrics = precision_recall.get_result()
+ fetch_vars = []
+ metric_keys = []
+ for item in metrics.items():
+ fetch_vars.append(item[1])
+ metric_keys.append(item[0])
+
+ exe = fluid.Executor(self.place)
+ exe.run(fluid.default_startup_program())
+ for i in range(self.batch_nums):
+ outs = exe.run(
+ fluid.default_main_program(),
+ feed={'predict': self.datas[i][0],
+ 'label': self.datas[i][1]},
+ fetch_list=fetch_vars,
+ return_numpy=True)
+
+ outs = dict(zip(metric_keys, outs))
+ self.assertTrue(np.allclose(outs['[TP FP TN FN]'], self.states))
+ self.assertTrue(np.allclose(outs['precision_recall_f1'], self.metrics))
+
+ def test_exception(self):
+ self.assertRaises(Exception, PrecisionRecall)
+ self.assertRaises(
+ Exception,
+ PrecisionRecall,
+ input=self.datas[0][0],
+ label=self.datas[0][1],
+ class_num=self.cls_num)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/test_recall_k.py b/tests/test_recall_k.py
new file mode 100644
index 0000000000000000000000000000000000000000..ebdbecaa1105bf7869dc32ff580fad880559ce41
--- /dev/null
+++ b/tests/test_recall_k.py
@@ -0,0 +1,96 @@
+# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed 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.
+
+from __future__ import print_function
+
+import unittest
+import numpy as np
+from paddlerec.core.metrics import RecallK
+import paddle
+import paddle.fluid as fluid
+
+
+class TestRecallK(unittest.TestCase):
+ def setUp(self):
+ self.ins_num = 64
+ self.cls_num = 10
+ self.topk = 2
+ self.batch_nums = 3
+
+ self.datas = []
+ self.match_num = 0.0
+ for i in range(self.batch_nums):
+ z = np.random.uniform(0, 1.0, (self.ins_num,
+ self.cls_num)).astype('float32')
+ pred = np.exp(z) / sum(np.exp(z))
+ label = np.random.choice(range(self.cls_num),
+ self.ins_num).reshape(
+ (self.ins_num, 1)).astype('int64')
+ self.datas.append((pred, label))
+ max_k_preds = pred.argsort(
+ axis=1)[:, -self.topk:][:, ::-1] #top-k label
+ match_array = np.logical_or.reduce(max_k_preds == label, axis=1)
+ self.match_num += np.sum(match_array).astype('float32')
+ self.place = fluid.core.CPUPlace()
+
+ def build_network(self):
+ pred = fluid.data(
+ name="pred",
+ shape=[-1, self.cls_num],
+ dtype='float32',
+ lod_level=0)
+
+ label = fluid.data(
+ name="label", shape=[-1, 1], dtype='int64', lod_level=0)
+
+ recall_k = RecallK(input=pred, label=label, k=self.topk)
+ return recall_k
+
+ def test_forward(self):
+ net = self.build_network()
+ metrics = net.get_result()
+ fetch_vars = []
+ metric_keys = []
+ for item in metrics.items():
+ fetch_vars.append(item[1])
+ metric_keys.append(item[0])
+
+ exe = fluid.Executor(self.place)
+ exe.run(fluid.default_startup_program())
+ for i in range(self.batch_nums):
+ outs = exe.run(
+ fluid.default_main_program(),
+ feed={'pred': self.datas[i][0],
+ 'label': self.datas[i][1]},
+ fetch_list=fetch_vars,
+ return_numpy=True)
+
+ outs = dict(zip(metric_keys, outs))
+ self.assertTrue(
+ np.allclose(outs['InsCnt'], self.ins_num * self.batch_nums))
+ self.assertTrue(np.allclose(outs['RecallCnt'], self.match_num))
+ self.assertTrue(
+ np.allclose(outs['Acc(Recall@%d)' % (self.topk)],
+ np.array(self.match_num / (self.ins_num *
+ self.batch_nums))))
+
+ def test_exception(self):
+ self.assertRaises(Exception, RecallK)
+ self.assertRaises(
+ Exception, RecallK, input=self.datas[0][0],
+ label=self.datas[0][1]),
+
+
+if __name__ == '__main__':
+ unittest.main()